Android 上的 Facebook 个人资料 getName() 始终返回 null

Facebook Profile getName() on Android always returning null

我的 Facebook 登录 Activity 如果有帮助:

public class LoginActivity extends AppCompatActivity {
    private LoginButton loginButton;
    private CallbackManager callbackManager;

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        callbackManager.onActivityResult(requestCode, resultCode, data);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FacebookSdk.sdkInitialize(getApplicationContext());
        callbackManager = CallbackManager.Factory.create();
        setContentView(R.layout.activity_login);
        loginButton = (LoginButton) findViewById(R.id.login_button);
        loginButton.setReadPermissions("public_profile", "user_friends");
        final Intent myIntent = new Intent(this, MapsActivity.class);
        if (isLoggedIn()) {
            startActivity(myIntent);
            finish();
            return;
        }
        loginButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(final View v) {
                // Callback registration
                loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
                    @Override
                    public void onSuccess(LoginResult loginResult) {
                        LoginManager.getInstance().logInWithReadPermissions(LoginActivity.this, Arrays.asList("public_profile", "user_friends"));
                        startActivity(myIntent);
                        finish();
                    }

                    @Override
                    public void onCancel() {
                    }

                    @Override
                    public void onError(FacebookException exception) {
                    }
                });
            }
        });

    }

    private boolean isLoggedIn() {
        AccessToken accessToken = AccessToken.getCurrentAccessToken();
        return accessToken != null;
    }
}

以及我用来尝试从某人的 ID 中获取其名字的代码:

new Profile(creatorId, null, null, null, null, null).getFirstName()

除了 getName() 之外,我还尝试了此处显示的 getFirstName() 调用,两者始终 return 为空。我认为在我请求的 Facebook 权限中具有 "public_profile" 将允许我以这种方式获取某人的名字,如果他们在通过 Facebook 登录时授权了我的应用程序。然而,我并不总是在我请求的 Facebook 权限中有 "public_profile",但我已经强制所有用户使用当前代码和权限通过 Facebook 重新登录到我的应用程序,所以我认为这可以解决这个问题。然而,此函数保持 returning 为 null,我不确定为什么。

此外,creatorId 可能是与当前登录的 FB 用户不同的用户的 FB ID。(他们过去会授权+使用该应用程序,只是没有该 Android 设备上的当前登录用户)。

因此,即使对于 public 配置文件信息,图形请求似乎也是必要的。这是我用来获取某个 Facebook ID 的名字的图形请求,creatorId:

    GraphRequest request = GraphRequest.newGraphPathRequest(
            AccessToken.getCurrentAccessToken(),
            creatorId,
            new GraphRequest.Callback() {
                @Override
                public void onCompleted(GraphResponse response) {
                    try {
                        Log.e("creatorId's first name:", response.getJSONObject().getString("first_name"));
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            });
    Bundle params = new Bundle();
    params.putString("fields", "id,first_name");
    request.setParameters(params);
    request.executeAsync();

You can use this code. please change your GraphRequest.GraphJSONObjectCallback() interface

GraphRequest request = GraphRequest.newMeRequest(AccessToken.getCurrentAccessToken(),                                
new GraphRequest.GraphJSONObjectCallback() {

                                @Override
                                public void onCompleted(JSONObject user, GraphResponse graphResponse) {
                                    try {
                                                                                    Log.e(TAG,"id"+user.optString("id"));                                            
                                        Log.e(TAG,"id"+user.optString("first_name"));


                                    } catch (Exception e) {
                                        e.printStackTrace();
                                    }
                                }
                            });
                    Bundle parameters = new Bundle();
                    parameters.putString("fields", "id,first_name");
                    request.setParameters(parameters);
                    request.executeAsync();`