问题
I am unable to get basic profile info from the ProfileTracker
function from Facebook SDK v4. How can I get all the info?
I am currently successfully logging in and geting accesstoken
and user-id
.
Code:
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);
}
Error:
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)
回答1:
To make this work, there are 3 parts of code that you need to incorporate into your code:
Create your
profileTracker
:mProfileTracker = new ProfileTracker() { @Override protected void onCurrentProfileChanged(Profile profile, Profile profile2) { updateUI(); //this is the third piece of code I will discuss below } };
Make sure you start your
profileTracker
inonCreate
as per Facebook's doc:mProfileTracker.startTracking();
Get the profile information:
private void updateUI(){ boolean enableButtons = AccessToken.getCurrentAccessToken() != null; Profile profile = Profile.getCurrentProfile(); if (profile == null) { Log.e("Profile", "null"); } if (enableButtons && profile != null) { Log.e("Access Token",AccessToken.getCurrentAccessToken().toString()); Log.e("TabSocial", profile.getName()); }
}
I discovered this after spending 3 hours this morning testing out the HelloFacebookSample app.
回答2:
You can look this example project on github. I tried this code and work. https://github.com/oliguo/android-facebook
You must add info field there
Bundle parameters = new Bundle();
parameters.putString("fields", "id,name,email,birthday,gender");
request.setParameters(parameters);
request.executeAsync();
Good luck there.
回答3:
From my experience, you have to manually call getCurrentProfile, even in Profile tracker listener. Try this code, I'm sure it works.
Profile.getCurrentProfile() //get current instance of logged profile
Profile.getCurrentProfile().getId() //get current id
Profile.getCurrentProfile().getName() //get current user name
And here's my code snippet:
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
}
}
};
Also, you can find more info, in documentation.
You an also get that info, in onSuccess
Login callback method, just add that snippet:
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());
}
来源:https://stackoverflow.com/questions/29667306/unable-to-get-profile-info-from-facebook-in-android-sdk-4