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:在一个请求中获取更大的图片

Facebook Graph API v2.0+ - /me/friends 返回空,或仅返回也使用我的应用程序的朋友

Facebook Graph API me / accounts返回空的Json数据数组

facebook graph api get /me/scores 不适用于所有用户