Android 截击post请求令牌Sony Lifelog
我在为令牌(Lifelog API)交换授权代码时遇到问题。这是我的代码: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
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
,如我在