Как получить информацию о профиле пользователя из Facebook API Android

Я пытаюсь получить информацию о профиле пользователя в Facebook. Начинает загрузку, я нажимаю, чтобы подтвердить разрешение на отправку моего профиля, снова, продолжить загрузку, но в конечном итоге получить пустые поля.

Что я делаю не так? Помоги пожалуйста.

public class SettingsApps extends Activity { public final String API_KEY = "492429660800628"; Facebook facebook = new Facebook(API_KEY); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.settings); mPrefs=getPreferences(MODE_PRIVATE); String acces_token=mPrefs.getString("acces_token",null); long expires=mPrefs.getLong("acces_expires", 0); if (Session.getActiveSession() == null || Session.getActiveSession().isClosed()) { Session.openActiveSession(this, true, new StatusCallback() { public void call(Session session, SessionState state, Exception exception) { System.out.println("State= " + state); if (session.isOpened()) { System.out.println("Token=" + session.getAccessToken()); Request request = Request.newMeRequest(session, new GraphUserCallback() { public void onCompleted(GraphUser user, Response response) { if (user != null) { TextView idText = (TextView)findViewById(R.id.id); TextView first_nameText = (TextView)findViewById(R.id.first_name); TextView last_nameText = (TextView)findViewById(R.id.last_name); idText.setText(user.getId()); first_nameText.setText(user.getFirstName()); last_nameText.setText(user.getLastName()); } if (response != null) { System.out.println("Response=" + response); Toast.makeText(SettingsApps.this, response.toString(), Toast.LENGTH_LONG).show(); } } }); Request.executeBatchAsync(request); } if (exception != null) { System.out.println("Some thing bad happened!"); exception.printStackTrace(); } } }); } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); facebook.authorizeCallback(requestCode, resultCode, data); } } 

LogCat

 669: INFO/ActivityManager(72): Starting: Intent { cmp=com.fitness_sport_betta/.SettingsApps } from pid 847 899: INFO/ActivityManager(72): Starting: Intent { act=SSO_WITH_FALLBACK cmp=com.fitness_sport_betta/com.facebook.LoginActivity (has extras) } from pid 847 949: INFO/System.out(847): State= OPENING 539: INFO/ActivityManager(72): Displayed com.fitness_sport_betta/com.facebook.LoginActivity: +621ms (total +851ms) 669: DEBUG/dalvikvm(389): GC_CONCURRENT freed 1685K, 41% free 6996K/11783K, external 716K/1038K, paused 16ms+11ms 420: WARN/fb4a:fb:OrcaServiceQueue(389): Exception during service 420: WARN/fb4a:fb:OrcaServiceQueue(389): com.facebook.orca.protocol.base.ApiException: remote_app_id does not match stored id 420: WARN/fb4a:fb:OrcaServiceQueue(389): at com.facebook.orca.protocol.base.ApiResponseChecker.b(ApiResponseChecker.java:74) 420: WARN/fb4a:fb:OrcaServiceQueue(389): at com.facebook.orca.protocol.base.ApiResponseChecker.a(ApiResponseChecker.java:103) 420: WARN/fb4a:fb:OrcaServiceQueue(389): at com.facebook.orca.protocol.base.ApiResponse.g(ApiResponse.java:184) 420: WARN/fb4a:fb:OrcaServiceQueue(389): at com.facebook.katana.server.protocol.AuthorizeAppMethod.a(AuthorizeAppMethod.java:267) 420: WARN/fb4a:fb:OrcaServiceQueue(389): at com.facebook.katana.server.protocol.AuthorizeAppMethod.a(AuthorizeAppMethod.java:28) 420: WARN/fb4a:fb:OrcaServiceQueue(389): at com.facebook.orca.protocol.base.SingleMethodRunner.a(SingleMethodRunner.java:125) 420: WARN/fb4a:fb:OrcaServiceQueue(389): at com.facebook.katana.server.handler.PlatformOperationHandler.c(PlatformOperationHandler.java:274) 420: WARN/fb4a:fb:OrcaServiceQueue(389): at com.facebook.katana.server.handler.PlatformOperationHandler.a(PlatformOperationHandler.java:175) 420: WARN/fb4a:fb:OrcaServiceQueue(389): at com.facebook.orca.server.OrcaServiceQueue.d(OrcaServiceQueue.java:214) 420: WARN/fb4a:fb:OrcaServiceQueue(389): at com.facebook.orca.server.OrcaServiceQueue.d(OrcaServiceQueue.java:37) 420: WARN/fb4a:fb:OrcaServiceQueue(389): at com.facebook.orca.server.OrcaServiceQueue$3.run(OrcaServiceQueue.java:168) 420: WARN/fb4a:fb:OrcaServiceQueue(389): at android.os.Handler.handleCallback(Handler.java:587) 420: WARN/fb4a:fb:OrcaServiceQueue(389): at android.os.Handler.dispatchMessage(Handler.java:92) 420: WARN/fb4a:fb:OrcaServiceQueue(389): at android.os.Looper.loop(Looper.java:123) 420: WARN/fb4a:fb:OrcaServiceQueue(389): at android.os.HandlerThread.run(HandlerThread.java:60) 459: INFO/ActivityManager(72): Starting: Intent { act=com.facebook.platform.PLATFORM_ACTIVITY cat=[android.intent.category.DEFAULT] cmp=com.facebook.katana/.platform.PlatformActivity (has extras) } from pid 847 639: INFO/ActivityManager(72): Starting: Intent { cmp=com.facebook.katana/.platform.PlatformWrapperActivity (has extras) } from pid 389 670: INFO/ActivityManager(72): Displayed com.facebook.katana/.platform.PlatformActivity: +1s87ms 779: INFO/ActivityManager(72): Displayed com.facebook.katana/.platform.PlatformWrapperActivity: +1s106ms 449: WARN/fb4a:fb:OrcaServiceQueue(389): Exception during service 449: WARN/fb4a:fb:OrcaServiceQueue(389): com.facebook.orca.protocol.base.ApiException: remote_app_id does not match stored id 449: WARN/fb4a:fb:OrcaServiceQueue(389): at com.facebook.orca.protocol.base.ApiResponseChecker.b(ApiResponseChecker.java:74) 449: WARN/fb4a:fb:OrcaServiceQueue(389): at com.facebook.orca.protocol.base.ApiResponseChecker.a(ApiResponseChecker.java:103) 449: WARN/fb4a:fb:OrcaServiceQueue(389): at com.facebook.orca.protocol.base.ApiResponse.g(ApiResponse.java:184) 449: WARN/fb4a:fb:OrcaServiceQueue(389): at com.facebook.katana.server.protocol.AuthorizeAppMethod.a(AuthorizeAppMethod.java:267) 449: WARN/fb4a:fb:OrcaServiceQueue(389): at com.facebook.katana.server.protocol.AuthorizeAppMethod.a(AuthorizeAppMethod.java:28) 449: WARN/fb4a:fb:OrcaServiceQueue(389): at com.facebook.orca.protocol.base.SingleMethodRunner.a(SingleMethodRunner.java:125) 449: WARN/fb4a:fb:OrcaServiceQueue(389): at com.facebook.katana.server.handler.PlatformOperationHandler.c(PlatformOperationHandler.java:274) 449: WARN/fb4a:fb:OrcaServiceQueue(389): at com.facebook.katana.server.handler.PlatformOperationHandler.a(PlatformOperationHandler.java:175) 449: WARN/fb4a:fb:OrcaServiceQueue(389): at com.facebook.orca.server.OrcaServiceQueue.d(OrcaServiceQueue.java:214) 449: WARN/fb4a:fb:OrcaServiceQueue(389): at com.facebook.orca.server.OrcaServiceQueue.d(OrcaServiceQueue.java:37) 449: WARN/fb4a:fb:OrcaServiceQueue(389): at com.facebook.orca.server.OrcaServiceQueue$3.run(OrcaServiceQueue.java:168) 449: WARN/fb4a:fb:OrcaServiceQueue(389): at android.os.Handler.handleCallback(Handler.java:587) 449: WARN/fb4a:fb:OrcaServiceQueue(389): at android.os.Handler.dispatchMessage(Handler.java:92) 449: WARN/fb4a:fb:OrcaServiceQueue(389): at android.os.Looper.loop(Looper.java:123) 449: WARN/fb4a:fb:OrcaServiceQueue(389): at android.os.HandlerThread.run(HandlerThread.java:60) 469: WARN/fb4a:fb:GDPDialog(389): Failed to send 469: WARN/fb4a:fb:GDPDialog(389): com.facebook.orca.ops.ServiceException: API_ERROR: API_ERROR 469: WARN/fb4a:fb:GDPDialog(389): at com.facebook.orca.ops.OrcaServiceOperation.c(OrcaServiceOperation.java:597) 469: WARN/fb4a:fb:GDPDialog(389): at com.facebook.orca.ops.OrcaServiceOperation.c(OrcaServiceOperation.java:38) 469: WARN/fb4a:fb:GDPDialog(389): at com.facebook.orca.ops.OrcaServiceOperation$2.run(OrcaServiceOperation.java:562) 469: WARN/fb4a:fb:GDPDialog(389): at android.os.Handler.handleCallback(Handler.java:587) 469: WARN/fb4a:fb:GDPDialog(389): at android.os.Handler.dispatchMessage(Handler.java:92) 469: WARN/fb4a:fb:GDPDialog(389): at android.os.Looper.loop(Looper.java:123) 469: WARN/fb4a:fb:GDPDialog(389): at android.app.ActivityThread.main(ActivityThread.java:3683) 469: WARN/fb4a:fb:GDPDialog(389): at java.lang.reflect.Method.invokeNative(Native Method) 469: WARN/fb4a:fb:GDPDialog(389): at java.lang.reflect.Method.invoke(Method.java:507) 469: WARN/fb4a:fb:GDPDialog(389): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 469: WARN/fb4a:fb:GDPDialog(389): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 469: WARN/fb4a:fb:GDPDialog(389): at dalvik.system.NativeStart.main(Native Method) 009: WARN/InputManagerService(72): Starting input on non-focused client com.android.internal.view.IInputMethodClient$Stub$Proxy@40677138 (uid=10030 pid=847) 009: WARN/InputManagerService(72): Client not active, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@40556e88 529: INFO/ActivityManager(72): Displayed com.fitness_sport_betta/.SettingsApps: +10s839ms 

Последние изменения:

 public class SettingsApps extends Activity { public final String API_KEY = "492429660800628"; Facebook facebook = new Facebook(API_KEY); public final String[] permissions = {"publish_stream"}; String mUserId; String mUserToken; String mUserName; String mUserEmail; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.settings); if (Session.getActiveSession() == null || Session.getActiveSession().isClosed()) { Session.openActiveSession(this, true, new StatusCallback() { public void call(final Session session, SessionState state, Exception exception) { System.out.println("State= " + state); authorizeAndPostMassage(); if (exception != null) { System.out.println("Some thing bad happened!"); exception.printStackTrace(); } } }); } } public void authorizeAndPostMassage() { facebook.authorize(this, permissions, new DialogListener () { public void onComplete(Bundle values) { Toast.makeText(SettingsApps.this, "Authorization successful", Toast.LENGTH_SHORT).show(); getProfileInformation(); } public void onFacebookError(FacebookError e) { Toast.makeText(SettingsApps.this, "Facebook error, try again later", Toast.LENGTH_SHORT).show(); } public void onError(DialogError e) { Toast.makeText(SettingsApps.this, "Error, try again later", Toast.LENGTH_SHORT).show(); } public void onCancel() { //Этот коллбэк никогда не срабатывает, вероятно, ошибка в SDK Toast.makeText(SettingsApps.this, "Authorization canceled", Toast.LENGTH_SHORT).show(); }}); } public void getProfileInformation() { try { JSONObject profile = Util.parseJson(facebook.request("me")); Log.e("Profile", "" + profile); mUserId = profile.getString("id"); mUserToken = facebook.getAccessToken(); mUserName = profile.getString("name"); mUserEmail = profile.getString("email"); runOnUiThread(new Runnable() { public void run() { Log.v("FaceBook_Profile",""+mUserId+"\n"+mUserToken+"\n"+mUserName+"\n"+mUserEmail); Toast.makeText(getApplicationContext(), "Name: " + mUserName + "\nEmail: " + mUserEmail, Toast.LENGTH_LONG).show(); } }); } catch (FacebookError e) { e.printStackTrace(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); facebook.authorizeCallback(requestCode, resultCode, data); } } 

Solutions Collecting From Web of "Как получить информацию о профиле пользователя из Facebook API Android"

Этот код для facebook SDK 3.0 Он работает!

 public class FacebookInfo extends Activity { ... String get_id, get_name, get_gender, get_email, get_birthday, get_locale, get_location; private Session.StatusCallback fbStatusCallback = new Session.StatusCallback() { public void call(Session session, SessionState state, Exception exception) { if (state.isOpened()) { Request.executeMeRequestAsync(session, new Request.GraphUserCallback() { public void onCompleted(GraphUser user, Response response) { if (response != null) { // do something with <response> now try{ get_id = user.getId(); get_name = user.getName(); get_gender = (String) user.getProperty("gender"); get_email = (String) user.getProperty("email"); get_birthday = user.getBirthday(); get_locale = (String) user.getProperty("locale"); get_location = user.getLocation().toString(); Log.d(LOG_TAG, user.getId() + "; " + user.getName() + "; " + (String) user.getProperty("gender") + "; " + (String) user.getProperty("email") + "; " + user.getBirthday()+ "; " + (String) user.getProperty("locale") + "; " + user.getLocation()); } catch(Exception e) { e.printStackTrace(); Log.d(LOG_TAG, "Exception e"); } } } }); } } }; ... protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.fbinfo); try { openActiveSession(this, true, fbStatusCallback, Arrays.asList( new String[] { "email", "user_location", "user_birthday", "user_likes", "publish_actions" }), savedInstanceState); } catch (Exception e) { e.printStackTrace(); } private Session openActiveSession(Activity activity, boolean allowLoginUI, StatusCallback callback, List<String> permissions, Bundle savedInstanceState) { OpenRequest openRequest = new OpenRequest(activity). setPermissions(permissions).setLoginBehavior(SessionLoginBehavior. SSO_WITH_FALLBACK).setCallback(callback). setDefaultAudience(SessionDefaultAudience.FRIENDS); Session session = Session.getActiveSession(); Log.d(LOG_TAG, "" + session); if (session == null) { Log.d(LOG_TAG, "" + savedInstanceState); if (savedInstanceState != null) { session = Session.restoreSession(this, null, fbStatusCallback, savedInstanceState); } if (session == null) { session = new Session(this); } Session.setActiveSession(session); if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED) || allowLoginUI) { session.openForRead(openRequest); return session; } } return null; } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data); } } 

Request.executeMeRequestAsync устарел! Итак, сделайте вот так:

Как только ваша сессия будет готова:

 private void getUserData(Session session, SessionState state) { if (state.isOpened()) { Request.newMeRequest(session, new Request.GraphUserCallback() { @Override public void onCompleted(GraphUser user, Response response) { if (response != null) { try { String name = user.getName(); // If you asked for email permission String email = (String) user.getProperty("email"); Log.e(LOG_TAG, "Name: " + name + " Email: " + email); } catch (Exception e) { e.printStackTrace(); Log.d(LOG_TAG, "Exception e"); } } } }).executeAsync(); } } 

Сначала создайте объект и подпишите для facebook:

 private static String FACEBOOK_APP_ID = "492429660800628"; private Facebook facebook; private AsyncFacebookRunner mAsyncRunner; 

После метода OnCreate:

 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.login_screen); facebook = new Facebook(FACEBOOK_APP_ID); mAsyncRunner = new AsyncFacebookRunner(facebook); loginFacebook();//this method when called when you required.. } private void loginFacebook() { if (!facebook.isSessionValid()) { facebook.authorize(this, new String[] { "email", "publish_stream", "read_stream" }, new LoginDialogListener()); } else { getProfileInformation(); } } class LoginDialogListener implements DialogListener { public void onComplete(Bundle values) { try { getProfileInformation(); } catch (Exception error) { Toast.makeText(LoginActivity.this, error.toString(), Toast.LENGTH_SHORT).show(); } } public void onFacebookError(FacebookError error) { Toast.makeText(LoginActivity.this, "Something went wrong. Please try again.", Toast.LENGTH_LONG).show(); } public void onError(DialogError error) { Toast.makeText(LoginActivity.this, "Something went wrong. Please try again.", Toast.LENGTH_LONG).show(); } public void onCancel() { Toast.makeText(LoginActivity.this, "Something went wrong. Please try again.", Toast.LENGTH_LONG).show(); } } 

Попробуйте этот метод после входа в систему facebook:

 public void getProfileInformation() { try { JSONObject profile = Util.parseJson(facebook.request("me")); Log.e("Profile", "" + profile); mUserId = profile.getString("id"); mUserToken = facebook.getAccessToken(); mUserName = profile.getString("name"); mUserEmail = profile.getString("email"); runOnUiThread(new Runnable() { public void run() { Log.e("FaceBook_Profile",""+mUserId+"\n"+mUserToken+"\n"+mUserName+"\n"+mUserEmail); Toast.makeText(getApplicationContext(), "Name: " + mUserName + "\nEmail: " + mUserEmail, Toast.LENGTH_LONG).show(); } }); } catch (FacebookError e) { e.printStackTrace(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } 

Во-первых: логин

 LoginManager loginManager = LoginManager.getInstance(); loginManager.registerCallback(callbackManager, new FacebookLoginCallback()); 

Затем: получите информацию о профиле

 // call this when login success Profile profile = Profile.getCurrentProfile(); // getAvatar String avatar = ImageRequest.getProfilePictureUri(profile.getId(), width, height).toString(); 
 //register callback object for facebook result LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() { @Override public void onSuccess(LoginResult loginResult) { //By Profile Class Profile profile = Profile.getCurrentProfile(); if (profile != null) { facebook_id=profile.getId(); f_name=profile.getFirstName(); m_name=profile.getMiddleName(); l_name=profile.getLastName(); full_name=profile.getName(); profile_image=profile.getProfilePictureUri(400, 400).toString(); } //Toast.makeText(FacebookLogin.this,"Wait...",Toast.LENGTH_SHORT).show(); GraphRequest request = GraphRequest.newMeRequest(AccessToken.getCurrentAccessToken(), new GraphRequest.GraphJSONObjectCallback() { @Override public void onCompleted(JSONObject object, GraphResponse response) { try { email_id=object.getString("email"); gender=object.getString("gender"); String profile_name=object.getString("name"); long fb_id=object.getLong("id"); //use this for logout } catch (JSONException e) { // TODO Auto-generated catch block // e.printStackTrace(); } } }); request.executeAsync(); } @Override public void onCancel() { Toast.makeText(FacebookLogin.this,getResources().getString(R.string.login_canceled_facebooklogin),Toast.LENGTH_SHORT).show(); progress.dismiss(); } @Override public void onError(FacebookException error) { Toast.makeText(FacebookLogin.this,getResources().getString(R.string.login_failed_facebooklogin),Toast.LENGTH_SHORT).show(); progress.dismiss(); } });