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();`
我的 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();`