Android 截击post请求令牌Sony Lifelog

Android 截击post请求令牌Sony Lifelog,android,oauth-2.0,android-volley,sony,sony-lifelog-api,Android,Oauth 2.0,Android Volley,Sony,Sony Lifelog Api,我在为令牌(Lifelog API)交换授权代码时遇到问题。这是我的代码: package daniele.lifel; import android.net.Uri; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import a

我在为令牌(Lifelog API)交换授权代码时遇到问题。这是我的代码:

package daniele.lifel;

import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.HashMap;
import java.util.Map;


public class MainActivity extends AppCompatActivity {


    WebView myWebView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final RequestQueue queue = Volley.newRequestQueue(this);

        myWebView = (WebView) findViewById(R.id.webview);
        myWebView.clearCache(true);

        myWebView.setWebViewClient(new WebViewClient() {


            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {

                if(url.contains("localhost")) {
                    Log.d("code",url); 
                    Uri uri =  Uri.parse( url );;
                    final String codice=(uri.getQueryParameter("code").toString());
                    Log.d("codice", codice); 





                    url = "https://platform.lifelog.sonymobile.com/oauth/2/token";
                    JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.POST,url,null,
                            new Response.Listener<JSONObject>() {
                                @Override
                                public void onResponse(JSONObject response) {

                                    try {

                                        String access_token = response.getString("access_token");
                                        Log.d("access_token",access_token);
                                        int expires_in = response.getInt("expires_in");
                                        String token_type = response.getString("token_type");
                                        String refresh_token = response.getString("refresh_token");
                                        int refresh_token_expires_in = response.getInt("refresh_token_expires_in");

                                    } catch (JSONException e) {
                                        e.printStackTrace();
                                    }
                                }
                            },
                            new Response.ErrorListener() {
                                @Override
                                public void onErrorResponse(VolleyError error) {
                                    Log.d("Volley error", error.toString());
                                }
                            }) {
                        protected Map<String, String> getParams() throws AuthFailureError {
                            Map<String, String>  params = new HashMap<String, String>();
                            params.put("client_id", "fc6badba-f7ef-4fec-a7ce-439563710f4f");
                            params.put("client_secret", "*********");
                            params.put("grant_type", "authorization_code");
                            params.put("code", codice);

                            return params;
                        }
                    };
                    queue.add(jsObjRequest);



                    return true;
                }

                Log.d("My Webview ", url);

                // return true; //Indicates WebView to NOT load the url;
                return false; //Allow WebView to load url
            }
        });



        myWebView.loadUrl("https://platform.lifelog.sonymobile.com/oauth/2/authorize?client_id=fc6badba-f7ef-4fec-a7ce-439563710f4f&scope=lifelog.activities.read");



    }




    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

}
包daniele.life;
导入android.net.Uri;
导入android.os.Bundle;
导入android.support.v7.app.AppActivity;
导入android.util.Log;
导入android.view.Menu;
导入android.view.MenuItem;
导入android.webkit.WebView;
导入android.webkit.WebViewClient;
导入com.android.volley.AuthFailureError;
导入com.android.volley.Request;
导入com.android.volley.RequestQueue;
导入com.android.volley.Response;
导入com.android.volley.VolleyError;
导入com.android.volley.toolbox.JsonObjectRequest;
导入com.android.volley.toolbox.volley;
导入org.json.JSONException;
导入org.json.JSONObject;
导入java.util.HashMap;
导入java.util.Map;
公共类MainActivity扩展了AppCompatActivity{
网络视图我的网络视图;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final RequestQueue=Volley.newRequestQueue(this);
myWebView=(WebView)findViewById(R.id.WebView);
myWebView.clearCache(true);
myWebView.setWebViewClient(新的WebViewClient(){
@凌驾
公共布尔值shouldOverrideUrlLoading(WebView视图,字符串url){
if(url.contains(“localhost”)){
Log.d(“代码”,url);
Uri=Uri.parse(url);;
最终字符串codice=(uri.getQueryParameter(“code”).toString();
日志d(“密码”,密码);
url=”https://platform.lifelog.sonymobile.com/oauth/2/token";
JsonObjectRequest jsObjRequest=新的JsonObjectRequest(Request.Method.POST,url,null,
新的Response.Listener(){
@凌驾
公共void onResponse(JSONObject响应){
试一试{
String access_token=response.getString(“access_token”);
Log.d(“访问令牌”,访问令牌);
int expires_in=response.getInt(“expires_in”);
String token_type=response.getString(“token_type”);
String refresh_token=response.getString(“refresh_token”);
int refresh\u token\u expires\u in=response.getInt(“refresh\u token\u expires\u in”);
}捕获(JSONException e){
e、 printStackTrace();
}
}
},
新的Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
Log.d(“截击错误”,error.toString());
}
}) {
受保护的映射getParams()引发AuthFailureError{
Map params=新的HashMap();
参数put(“客户id”,“fc6badba-f7ef-4fec-a7ce-439563710f4f”);
参数put(“客户机密”,“*******”);
参数put(“授权类型”、“授权代码”);
参数put(“代码”,密码);
返回参数;
}
};
add(jsObjRequest);
返回true;
}
Log.d(“我的网络视图”,url);
//返回true;//表示WebView不加载url;
返回false;//允许WebView加载url
}
});
myWebView.loadUrl(“https://platform.lifelog.sonymobile.com/oauth/2/authorize?client_id=fc6badba-f7ef-4fec-a7ce-439563710f4f&scope=lifelog.activities.read”);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(右菜单菜单菜单主菜单);
返回true;
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
//处理操作栏项目单击此处。操作栏将
//自动处理Home/Up按钮上的点击,只要
//在AndroidManifest.xml中指定父活动时。
int id=item.getItemId();
//noinspection SimplifiableIf语句
if(id==R.id.action\u设置){
返回true;
}
返回super.onOptionsItemSelected(项目);
}
}
我得到以下错误:

[25337]BasicNetwork.performRequest:的意外响应代码401


有什么解决办法吗?谢谢

尝试使用
getBody
而不是
getParams
您是否能够看到初始的Lifelog授权屏幕,或者应用程序是否立即给您一个错误?此外,你不应该在公共论坛上分享你的客户秘密。出于演示目的,您始终可以使用类似“*******”的内容替换您的客户机机密。我建议您尽快转到Lifelog管理控制台并创建一组新的凭据:@BNK我正在尝试,尤其是带有getBody()方法描述的答案,但它不起作用:错误显示encodeParameters()在中有私人访问权限Volley@Robert-Sony我可以看到最初的Lifelog授权屏幕,问题只是通过post请求交换令牌的授权代码。我已经更改了凭据,谢谢您的建议。@DanieleOriana请尝试
getBody
,如我在