Facebook Graph API /me 请求
Posted
技术标签:
【中文标题】Facebook Graph API /me 请求【英文标题】:Facebook Graph API /me Request 【发布时间】:2015-08-14 14:34:34 【问题描述】:我正在尝试将 Facebook 登录信息合并到我的 android 应用程序中。我遇到的问题是我似乎无法使用额外的参数发出成功的 /me request 请求。
如果我尝试自己执行 /me 请求,我可以获得用户 ID 和名称。我想获取额外的字段,例如电子邮件、名字、姓氏等。
错误
响应:responseCode:400,graphObject:空,错误:HttpStatus: 400,错误代码:2500,错误类型:OAuthException,错误消息:一个 必须使用主动访问令牌来查询有关 当前用户。
尝试提出请求
我在 LoginManager 内的 onSuccess 方法中执行此操作。
new GraphRequest(
loginResult.getAccessToken(),
"/me?fields=id,name,email",
null,
HttpMethod.GET,
new GraphRequest.Callback()
public void onCompleted(GraphResponse response)
/* handle the result */
).executeAsync();
【问题讨论】:
【参考方案1】:我认为 loginResult.getAccessToken() 有问题,试试这个:
Bundle params = new Bundle();
params.putString("fields", "id,name,email");
new GraphRequest(
AccessToken.getCurrentAccessToken(), //loginResult.getAccessToken(),
"/me",
params,
HttpMethod.GET,
new GraphRequest.Callback()
public void onCompleted(GraphResponse response)
try
Log.e("JSON",response.toString());
JSONObject data = response.getJSONObject();
//data.getString("id"),
//data.getString("name"),
//data.getString("email")
catch (Exception e)
e.printStackTrace();
).executeAsync();
使用您想要的完整权限检查登录成功
if (AccessToken.getCurrentAccessToken().getDeclinedPermissions().size() == 0)
【讨论】:
【参考方案2】:我可以尝试帮助您,因为我刚刚通过 facebook 登录并撤回了姓名和电子邮件,但我们确实需要查看您的所有代码。我会发布所有与您如何使用 facebook 课程有关的内容。以下是我使用的部分,如果它有帮助的话:
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
FacebookSdk.sdkInitialize(getApplicationContext());
callbackManager = CallbackManager.Factory.create();
loginButtonFacebook = (LoginButton) findViewById(R.id.login_button_facebook);
loginButtonFacebook.setReadPermissions("user_friends,email");
LoginManager.getInstance().registerCallback(callbackManager,
new FacebookCallback<LoginResult>()
@Override
public void onSuccess(LoginResult loginResult)
accessToken = loginResult.getAccessToken();
final SharedPreferences.Editor editor = prefs.edit();
editor.putString("facebookAccessToken", accessToken.getToken()).apply();
GraphRequest request = GraphRequest.newMeRequest(
accessToken,
new GraphRequest.GraphJSONObjectCallback()
@Override
public void onCompleted(JSONObject object, GraphResponse response)
getFacebookItems(object);
);
Bundle parameters = new Bundle();
parameters.putString("fields", "id,name,first_name,last_name,email,picture");
request.setParameters(parameters);
request.executeAsync();
@Override
public void onCancel()
Log.d(TAG, "Canceled");
@Override
public void onError(FacebookException exception)
Log.d(TAG, String.format("Error: %s", exception.toString()));
);
....
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
public void getFacebookItems(JSONObject object)
try
facebookId = object.getString("id");
facebookName = object.getString("name");
facebookFirstName = object.getString("first_name");
facebookLastName = object.getString("last_name");
facebookEmail = object.getString("email");
catch (JSONException e)
e.printStackTrace();
我还从另一个活动中访问 facebook 用户朋友,因此我将我的 accesstoken 存储在首选项中,以备日后需要时使用。
accessTokenString = prefs.getString("facebookAccessToken", "");
String facebookId = prefs.getString("facebookId", "");
if (facebookId.length() > 0 && accessTokenString.length() > 0)
accessToken = new AccessToken(accessTokenString, getString(R.string.facebook_app_id), facebookId, null, null, null, null, null);
storeFacebookFriends();
....
public void storeFacebookFriends()
if (accessToken != null)
GraphRequestBatch batch = new GraphRequestBatch(
GraphRequest.newMyFriendsRequest(
accessToken,
new GraphRequest.GraphJSONArrayCallback()
@Override
public void onCompleted(JSONArray jsonArray, GraphResponse response)
// Application code for users friends
userArray = jsonArray;
)
);
batch.addCallback(new GraphRequestBatch.Callback()
@Override
public void onBatchCompleted(GraphRequestBatch graphRequests)
// Application code for when the batch finishes
);
batch.executeAsync();
【讨论】:
以上是关于Facebook Graph API /me 请求的主要内容,如果未能解决你的问题,请参考以下文章
是否可以通过请求标头传递 Facebook Graph API 访问令牌?
Facebook Graph API:在一个请求中获取更大的图片
Facebook Graph API v2.0+ - /me/friends 返回空,或仅返回也使用我的应用程序的朋友