0

我正在使用android-simple-facebook庫實現Facebook登錄。
它運作良好,在Eclipse中的例子,但在我的JNI應用中,出現以下錯誤崩潰:FB Android:Session:試圖打開已經打開的會話

java.lang.UnsupportedOperationException: Session: an attempt was made to open an already opened session. 
at com.facebook.Session.open(Session.java:985)             
at com.facebook.Session.openForPublish(Session.java:423)           
at com.sromku.simple.fb.SessionManager.openSession(SessionManager.java:237)      
at com.sromku.simple.fb.SessionManager.reopenSession(SessionManager.java:332)      
at com.sromku.simple.fb.SessionManager.isLogin(SessionManager.java:123)       
at com.sromku.simple.fb.SessionManager.login(SessionManager.java:57)        
at com.sromku.simple.fb.SimpleFacebook.login(SimpleFacebook.java:171)        
at com.js.helpers.FBHelper$2.run(FBHelper.java:109)            
at android.os.Handler.handleCallback(Handler.java:730)           
at android.os.Handler.dispatchMessage(Handler.java:92)           
at android.os.Looper.loop(Looper.java:137)              
at android.app.ActivityThread.main(ActivityThread.java:5103)          
at java.lang.reflect.Method.invokeNative(Native Method)           
at java.lang.reflect.Method.invoke(Method.java:525)            
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)    
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)         
at dalvik.system.NativeStart.main(Native Method)             

我登錄的實現是相當straitforward:

public static void login() { 

    final OnLoginListener onLoginListener = new OnLoginListener() { 
     @Override 
     public void onFail(String reason) { 
      Log.w(TAG, "onLoginListener failed: " + reason); 
     } 

     @Override 
     public void onException(Throwable throwable) { 
      Log.e(TAG, "OnLoginListener exception: ", throwable); 
     } 

     @Override 
     public void onThinking() { 
      // show progress bar or something to the user while login is happening 
      Log.i(TAG, "onLoginListener in progress..."); 
     } 

     @Override 
     public void onLogin() { 
      // change the state of the button or do whatever you want 
      Log.i(TAG, "Logged in"); 
      loginCB(); 
     } 

     @Override 
     public void onNotAcceptingPermissions(Permission.Type type) { 
      Log.i(TAG, "onLoginListener NotAcceptingPermissions: " + type); 
     } 
    }; 

    mSimpleFacebook.login(onLoginListener); 
    Log.i(TAG, "FBHelper.login"); 
} 

loginCB是我的家鄉回調函數。

問題最爲惱人的是浮動,應用程序有時可能會登錄,但主要是崩潰。
我會感謝任何幫助!

回答

0

我確定這是一個JNI問題。下面結合使我的代碼工作:

  • 移動OnLoginListener一個級別
  • 添加runOnUiThread
  • 添加的try/catch
  • 檢查mSimpleFacebook = NULL和固定IsLoggedIn函數爲了不要求登錄如果已經登錄(好吧,我看到這個情況在圖書館處理,但Facebook真的試圖重複登錄)。

所以,我最後的代碼是:

private static OnLoginListener mOnLoginListener = new OnLoginListener() { 
     // the same code as in question above 
}; 

public static void login(final Activity activity) { 

    activity.runOnUiThread(new Runnable() { 
     public void run() { 
      if (mSimpleFacebook == null) 
       mSimpleFacebook = SimpleFacebook.getInstance(activity); 
      try { 
       mSimpleFacebook.login(mOnLoginListener); 
      } catch (Exception ex) { 
       Log.e(TAG, "Login error: ", ex); 
      } 
     } 
    }); 
} 
1

它看起來像你錯過:onActivityResultActivity

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    mSimpleFacebook.onActivityResult(this, requestCode, resultCode, data); 
    super.onActivityResult(requestCode, resultCode, data); 
} 

讓我知道,如果它爲你工作。

+0

我有這個代碼塊,這個問題是在另一個地方。 – deko