2013-01-07 205 views
9

我正在嘗試獲取用戶個人資料信息Facebook。開始加載,我點擊確認發送我的個人資料的權限,再次,繼續加載,但最終得到空的領域。如何從Facebook API獲取用戶個人資料信息Android

我在做什麼錯?請幫助。

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 [email protected] (uid=10030 pid=847) 
009: WARN/InputManagerService(72): Client not active, ignoring focus gain of: [email protected] 
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); 
    } 
} 

回答

18

這對於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); 
} 
} 
+1

用戶返回始終爲空所以,你可以請你建議我爲什麼 – Dilip

+0

@羅曼你能否提供完整的代碼來獲取用戶配置文件數據。 – Kunu

+2

Request.executeMeRequestAsync已棄用,所以從現在開始你必須使用Request.newMeRequest,請參閱下面的答案 – David

2

首先創建對象和veriable爲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(); 
    } 
} 

請嘗試登錄博客後,這個方法:

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(); 
    } 

} 
+0

原諒我的文盲,但我不知道在哪裏插入代碼。我在過去四天pereprobyval十幾個代碼。我知道它應該有效,但我還沒有出來。 – Roman

+0

首先你能夠用facebook登錄? –

+0

是的,我安裝了Facebook的SDK,我可以去我的網頁上。 – Roman

7

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(); 
    } 
} 
+2

我得到一些錯誤,因爲一些類像SessionState或GraphUser「無法解析爲類型」...或因爲「類型com.facebook.login.LoginClient不可見」...我怎麼能解決它? – KryNaC

2
//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(); 
     } 
    }); 
1

第一:登錄

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(); 
+0

謝謝!快速片段 – Gagandeep

相關問題