我无法从Facebook SDK v4的ProfileTracker
功能获取基本个人资料信息。我如何获得所有信息?
我目前正在成功登录并设置accesstoken
和user-id
。
代码:
public class HelloFacebookSampleActivity extends FragmentActivity {
LoginButton loginButton ;
CallbackManager callbackManager;
private String fbUserID;
private String fbProfileName;
private String fbAuthToken;
private AccessTokenTracker accessTokenTracker;
private ProfileTracker profileTracker;
private static final String TAG = "FacebookLogin";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FacebookSdk.sdkInitialize(getApplicationContext());
callbackManager = CallbackManager.Factory.create();
setContentView(R.layout.test);
loginButton = (LoginButton) findViewById(R.id.login_button);
loginButton.setReadPermissions("user_friends,email,user_birthday,user_likes");
profileTracker = new ProfileTracker() {
@Override
protected void onCurrentProfileChanged(
Profile oldProfile,
Profile currentProfile) {
fbProfileName = currentProfile.getName();
Toast.makeText(getBaseContext(),"profile",Toast.LENGTH_LONG).show();
Log.d(TAG, "FirstName: " + currentProfile.getFirstName() );
Log.d(TAG, "LastName: " + currentProfile.getLastName() );
Log.d(TAG, " MiddleName: " + currentProfile.getMiddleName() );
Log.d(TAG, "LinkUri: " + currentProfile.getLinkUri() );
Log.d(TAG, "ProfilePictureUri: " + currentProfile.getProfilePictureUri(250,250) );
}
};
accessTokenTracker = new AccessTokenTracker() {
@Override
protected void onCurrentAccessTokenChanged(
AccessToken oldAccessToken,
AccessToken currentAccessToken) {
fbAuthToken = currentAccessToken.getToken();
fbUserID = currentAccessToken.getUserId();
Log.d(TAG, "User id: " + fbUserID);
Log.d(TAG, "Access token is: " + fbAuthToken);
// Ensure that our profile is up to date
Profile.fetchProfileForCurrentAccessToken();
}
};
// Callback registration
loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
}
@Override
public void onCancel() {
// App code
Toast.makeText(getBaseContext(),"cancel",Toast.LENGTH_LONG).show();
}
@Override
public void onError(FacebookException exception) {
// App code
Toast.makeText(getBaseContext(),"er",Toast.LENGTH_LONG).show();
}
});
}
@Override
public void onDestroy() {
super.onDestroy();
accessTokenTracker.stopTracking();
profileTracker.stopTracking();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
}
错误:
java.lang.NullPointerException: Attempt to invoke interface method 'void com.android.okhttp.internal.http.Transport.writeRequestHeaders(com.android.okhttp.Request)' on a null object reference
at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:611)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:388)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:332)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:500)
at com.android.okhttp.internal.http.DelegatingHttpsURLConnection.getResponseCode(DelegatingHttpsURLConnection.java:105)
at com.android.okhttp.internal.http.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:25)
答案 0 :(得分:1)
您可以在github上查看此示例项目。我试过这个代码并且工作。 https://github.com/oliguo/android-facebook
您必须在那里添加信息字段
Bundle parameters = new Bundle();
parameters.putString("fields", "id,name,email,birthday,gender");
request.setParameters(parameters);
request.executeAsync();
祝你好运。
答案 1 :(得分:0)
根据我的经验,您必须手动调用getCurrentProfile,即使在Profile跟踪器侦听器中也是如此。试试这段代码,我相信它有效。
Profile.getCurrentProfile() //get current instance of logged profile
Profile.getCurrentProfile().getId() //get current id
Profile.getCurrentProfile().getName() //get current user name
这是我的代码片段:
profileTracker = new ProfileTracker() { //initializing profile tracker, so it can respond to it's state changes
@Override
protected void onCurrentProfileChanged(Profile oldProfile, Profile currentProfile) { //if new profile is logged
Profile.fetchProfileForCurrentAccessToken(); //manually force profile fetching from current token
if(Profile.getCurrentProfile() != null) { //if it available
Log.i(TAG, Profile.getCurrentProfile().getName() + ", " + Profile.getCurrentProfile().getId() + ", " + Profile.getCurrentProfile().getLinkUri());
} else {
Log.i(TAG, "Profile is null");
showLoginActivity(); //no profile - login again
}
}
};
另外,您可以在documentation中找到更多信息。
您也可以在onSuccess
登录回调方法中获取该信息,只需添加该代码段:
if(Profile.getCurrentProfile() != null && AccessToken.getCurrentAccessToken() != null) {
Log.i(TAG, Profile.getCurrentProfile().getName() + ", " + Profile.getCurrentProfile().getId() + ", " + Profile.getCurrentProfile().getLinkUri());
} else {
AccessToken.getCurrentAccessToken();
Profile.fetchProfileForCurrentAccessToken();
Log.i(TAG, Profile.getCurrentProfile().getName() + ", " + Profile.getCurrentProfile().getId() + ", " + Profile.getCurrentProfile().getLinkUri());
}