2015-04-29 62 views
3

當我嘗試在Kitkat上登錄facebook時,我得到一個NPE,在棒棒糖MR1上正常工作。我嘗試4.0.0和4.0.1Facebook SDK 4.0.1登錄NPE

我的登錄代碼:

LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList(READ_PERMISSIONS));

飛機墜毀

java.lang.RuntimeException: Unable to start activity ComponentInfo{lt.segfoltas.psm/com.facebook.FacebookActivity}: java.lang.NullPointerException 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2198) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2257) 
      at android.app.ActivityThread.access$800(ActivityThread.java:139) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:136) 
      at android.app.ActivityThread.main(ActivityThread.java:5086) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
      at dalvik.system.NativeStart.main(Native Method) 
    Caused by: java.lang.NullPointerException 
      at com.facebook.login.LoginFragment.onCreate(LoginFragment.java:68) 
      at android.support.v4.app.Fragment.performCreate(Fragment.java:1763) 
      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:915) 
      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1136) 
      at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739) 
      at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1499) 
      at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:548) 
      at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1194) 
      at android.app.Activity.performStart(Activity.java:5258) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2171) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2257) 
            at android.app.ActivityThread.access$800(ActivityThread.java:139) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:136) 
            at android.app.ActivityThread.main(ActivityThread.java:5086) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:515) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
            at dalvik.system.NativeStart.main(Native Method) 

相關清單項

<activity android:name="com.facebook.FacebookActivity" 
      android:configChanges= 
       "keyboard|keyboardHidden|screenLayout|screenSize|orientation" 
      android:theme="@android:style/Theme.Translucent.NoTitleBar" 
      android:label="@string/app_name" /> 

應用程序ID是設置在裏面創建

FacebookSdk.setApplicationId(FacebookData.APP_ID); 
    FacebookSdk.sdkInitialize(getApplicationContext()); 

立即在調用登錄後,我得到一個響應,登錄被取消。然後,應用程序崩潰。

Facebook的代碼,其中的崩潰就被報告:

this.callingPackage = this.getActivity().getCallingActivity().getPackageName(); 

我的權限:

private static final String[] READ_PERMISSIONS = new String[]{"public_profile", "user_events", "user_birthday", "email"}; 
+0

[登錄博客的getLocation和電子郵件(http://stackoverflow.com/questions/29605236/login-facebook-getlocation-and-email)的可能重複,檢查出的答案,我想你會發現失去了什麼。 –

回答

3

發現了什麼墜毀。如果調用活動設置爲singleInstance,則Login方法在Facebook的LoginFragment內崩潰。我不知道是否有解決方法。

編輯:

它看起來像Facebook的部分固定的問題SDK 4.1

4。0得到:

this.callingPackage = this.getActivity().getCallingActivity().getPackageName(); 

當從singleInstance活動調用login時,會導致NPE。

現在看起來LoginActivity將退出並在出現這種情況時報告錯誤。

// If the calling package is null, this generally means that the callee was started 
    // with a launchMode of singleInstance. Unfortunately, Android does not allow a result 
    // to be set when the callee is a singleInstance, so we log an error and return. 
    if (callingPackage == null) { 
     Log.e(TAG, NULL_CALLING_PKG_ERROR_MSG); 
     getActivity().finish(); 
     return; 
    } 
+0

相同的解決方案,但'SingleInstance'如何失敗? – jayatubi

+0

getCallingActivity()沒有空檢查 – DariusL

0

沒有關於如何實現對Facebook的Android SDK中某些功能的變化,第一:

您不要在代碼中設置應用程序Id,它現在可以通過A中的元數據標記完成ndroidManifest.xml文件。

下面是一個例子:

權之前,在清單中的結束標記必須設置:

<!-- Facebook Integration --> 
     <activity 
      android:name="com.facebook.FacebookActivity" 
      android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation" 
      android:label="@string/app_name" 
      android:theme="@android:style/Theme.Translucent.NoTitleBar" /> 

     <meta-data 
      android:name="com.facebook.sdk.ApplicationId" 
      android:value="@string/facebook_id" /> 

現在對你的onCreate您使用新LoginManager類所有登錄稱,唐」牛逼需要UI,作爲例如下面的documentation例如:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    FacebookSdk.sdkInitialize(this.getApplicationContext()); 

    callbackManager = CallbackManager.Factory.create(); 

    LoginManager.getInstance().registerCallback(callbackManager, 
      new FacebookCallback<LoginResult>() { 
       @Override 
       public void onSuccess(LoginResult loginResult) { 
        // App code 
       } 

       @Override 
       public void onCancel() { 
        // App code 
       } 

       @Override 
       public void onError(FacebookException exception) { 
        // App code 
       } 
    }); 
} 

你總是可以看到新的SDK所有變化和文檔

UPDATE: 下面是有關如何使用Array.AsList();

通過權限的例子... logInWithReadPermissions(this, Arrays.asList("public_profile", "email");

+0

我會嘗試將應用程序ID移動到元數據。我的回調是在你發佈的時候設置的。正如我所說的,我在調用logInWithReadPermissions之後立即接到onCancel的調用。 – DariusL

+0

當然,順便說一句,你通過Arrays.asList傳遞了什麼權限(READ_PERMISSIONS)),我會用我在這裏做的事情更新我的答案,請讓我知道。謝謝 – Nullpoint

+0

已添加的權限 – DariusL