2013-07-14 58 views
2

我正在開發連接到Facebook的Android應用程序。Facebook登錄在HTC Desire上可用,但不能在Samsung Galaxy S3上登錄

這是我的代碼:

public class FBLoginActivity extends Activity 
{ 
    /** 
    * Log's tag. 
    */ 
    private static final String TAG = "FBLoginActivity"; 
    /** 
    * Widget to let user selects if he/she accepts conditions or not. 
    */ 
    private ToggleButton mTglBtnAcceptConditions; 
    /** 
    * Represents the button to Login into Facebook. 
    */ 
    private ImageButton mFBLoginButton; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_fblogin); 

     getWidgetsReferences(); 
    } 

    @Override 
    protected void onResume() 
    { 
     Log.v(TAG, "onResume"); 
     super.onResume(); 

     Session session = Session.getActiveSession(); 
     if ((session != null) && (session.isOpened())) 
     { 
      // Disable Facebook login button because user is logged. 
      mFBLoginButton.setEnabled(false); 
      // Show a message to the user saying that is logged. 
      Toast.makeText(this, 
        getString(R.string.toast_message_your_are_logged_fb), 
        Toast.LENGTH_LONG).show(); 
     } 
    } 
    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) 
    { 
     Log.v(TAG, "onActivityResult"); 
     super.onActivityResult(requestCode, resultCode, data); 

     Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data); 
    } 

    /** 
    * This method handles when user does click on Facebook's Login button. 
    * @param view 
    */ 
    public void onFBLoginClick(View view) 
    { 
     openActiveSession(this, true, statusCallback); 
    } 

    /** 
    * Status CallBack for Facebook Open Session. 
    */ 
    Session.StatusCallback statusCallback = new Session.StatusCallback() 
    { 
     @Override 
     public void call(final Session session, SessionState state, Exception exception) 
     { 
      Log.v(TAG, "call"); 
      if(session.isOpened()) 
      { 
       Log.v(TAG, "isOpened"); 
       // Show a dialog saying that we are storing user data into the 
       // phone. 
       final ProgressDialog savingDialog = new ProgressDialog(FBLoginActivity.this); 
       savingDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
       savingDialog.setMessage(getString(R.string.dialog_message_saving_your_fb_data)); 
       savingDialog.setCancelable(false); 
       savingDialog.show(); 

       Request.executeMeRequestAsync(session, new Request.GraphUserCallback() 
       { 
        @Override 
        public void onCompleted(GraphUser user, Response response) 
        { 
         Log.v(TAG, "onCompleted"); 
         if(user != null) 
         { 
          // Get Facebook's ID, name, gender, birthday and email. 
          String facebookId = user.getId(); 
          String name = user.getName(); 
          String gender = user.getProperty("gender").toString(); 
          String birthday = user.getBirthday(); 
          String email = user.getProperty("email").toString(); 

          // Save facebook data on Shared Preferences 
          saveUserData(facebookId, name, gender, birthday, email); 

          // Save Facebook access token on Shared preferences. 
          saveAccessToken(session.getAccessToken()); 

          // Close saving user's data dialog. 
          savingDialog.dismiss(); 

          // Get and save Facebook Profile Picture on internal 
          // storage. 
          GetFacebookProfilePicture task = 
            new GetFacebookProfilePicture(FBLoginActivity.this); 
          task.execute(user.getId()); 
         } 
        } 
       }); 
      } 
     } 
    }; 

    /** 
    * Open a Facebook's session to get user personal data. On the OpenRequest 
    * we set "user_birthday" and "email" permissions. 
    * 
    * @param activity 
    * @param allowLoginUI 
    * @param statusCallback 

    * @return Session opened with desired permissions. 
    */ 
    private static Session openActiveSession(Activity activity, 
      boolean allowLoginUI, Session.StatusCallback statusCallback) 
    { 
     OpenRequest openRequest = new OpenRequest(activity); 
     openRequest.setPermissions(Arrays.asList("user_birthday", "email")); 
     openRequest.setCallback(statusCallback); 

     Session session = new Session.Builder(activity).build(); 

     if(SessionState.CREATED_TOKEN_LOADED.equals(session.getState()) || allowLoginUI) 
     { 
      Session.setActiveSession(session); 
      session.openForRead(openRequest); 

      return session; 
     } 

     return null; 
    } 
} 

此代碼適用於Android模擬器,並在我的舊的HTC Desire。但是當我在三星Galaxy S3等最新設備上測試它時,它不起作用。

調試代碼,我在這裏補充一個斷點:if(session.isOpened())session對象是:

{Session state:OPENING, token:{AccessToken token:ACCESS_TOKEN_REMOVED permissions:[]}, appId:XXXXXXXXXXX} 

發生了什麼事?我認爲問題在於代碼無法在最快的設備上運行。

你知道另一種方法來做我在這裏做的事嗎?

回答

1

我要回答我的問題:

這裏的問題是不是在那裏我測試我的應用程序。問題是,在Samsumg Galaxy S3上,測試人員正在用他自己的Facebook帳戶進行測試,並且我還沒有停用SandBox。

我犯了另一個錯誤:在Facebook開發者門戶網站上,我還沒有添加發布令牌。

總之,檢查是否已在facebook開發人員門戶上停用SandBox,並且已添加調試和釋放令牌。

0

我想你不是通過提供申請ID來創建會話。試試這個

Session session = SessionClass.createSession(getApplicationContext()); 
OpenRequest openRequest = new OpenRequest(activity); 
     openRequest.setPermissions(Arrays.asList("user_birthday", "email")); 
     openRequest.setCallback(statusCallback); 
     session.openForRead(openRequest); 

public static Session createSession(Context context) { 
    Session activeSession = Session.getActiveSession(); 
    if (activeSession == null || activeSession.getState().isClosed()) { 
     activeSession = new Session.Builder(context).setApplicationId("255105497966505").build(); 
     Session.setActiveSession(activeSession); 
    } 
    return activeSession; 
} 
+0

感謝您的回答,但奇怪的是,相同的代碼適用於Android模擬器和HTC Desire,並且它不適用於三星Galaxy S3。 – VansFannel

+0

在您的Samsung Galaxy S3中是否安裝了原生facebook應用程序? –

+0

是的。本機應用程序安裝在Samsung Galaxy S3上。 – VansFannel

0
Also Try UiLifeCycleHelper class. 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_splash_screen); 

     this.uiHelper = new UiLifecycleHelper(this, callback); 
     this.uiHelper.onCreate(savedInstanceState); 
} 

    @Override 
    public void onResume() { 
     super.onResume(); 
     // For scenarios where the main activity is launched and user 
     // session is not null, the session state change notification 
     // may not be triggered. Trigger it if it's open/closed. 
     Session session = Session.getActiveSession(); 
     if (session != null && (session.isOpened() || session.isClosed())) { 
      onSessionStateChange(session, session.getState(), null); 
     } 
     uiHelper.onResume(); 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     uiHelper.onActivityResult(requestCode, resultCode, data); 
     Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     uiHelper.onPause(); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     uiHelper.onDestroy(); 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     uiHelper.onSaveInstanceState(outState); 
    } 
相關問題