简体   繁体   English

Facebook SDK 4.0.1登录NPE

[英]Facebook SDK 4.0.1 login NPE

I get an NPE when I try to login to facebook on Kitkat, works fine on Lollipop MR1. 当我尝试在Kitkat上登录facebook时,我得到一个NPE,在Lollipop MR1上正常工作。 I tried 4.0.0 and 4.0.1 我试过4.0.0和4.0.1

My login code: 我的登录代码:

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

the crash is 崩溃是

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)

The relevant manifest entry 相关的清单条目

<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" />

App id is set inside onCreate App id设置在onCreate中

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

Immediately after calling login, I get a response that the login was canceled. 呼叫登录后,我立即收到登录被取消的回复。 Then the app crashes. 然后应用程序崩溃了。

Facebook's code where the crash is reported: Facebook报告崩溃的代码:

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

My permissions: 我的权限:

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

Found out what crashed it. 发现它崩溃了什么。 Login method crashes inside facebook's LoginFragment if the calling activity is set to singleInstance. 如果调用活动设置为singleInstance,则登录方法会在Facebook的LoginFragment内崩溃。 I don't know if there's a workaround. 我不知道是否有解决方法。

Edit: 编辑:

It seems like Facebook partially fixed the issue in SDK 4.1 似乎Facebook部分修复了SDK 4.1中的问题

4.0 had: 4.0有:

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

Which results in a NPE when login is called from a singleInstance activity. 从singleInstance活动调用登录时会导致NPE。

Now it looks like LoginActivity will exit and report an error if this happens. 现在,如果发生这种情况,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;
    }

there were changes on how to implement certain features on the Facebook Android SDK, first: 有关如何在Facebook Android SDK上实现某些功能的更改,首先:

You don't set the applicationId in code, it now can be done though the metadata tag in the AndroidManifest.xml file. 您没有在代码中设置applicationId ,现在可以通过AndroidManifest.xml文件中的元数据标签来完成。

Here is an example: 这是一个例子:

Right before the closing tag at the manifest you must set: 在清单的结束标记之前,您必须设置:

   <!-- 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" />

Now on your onCreate you use the new LoginManager class for all your login calls that don't require a UI, as the example at the documentation example below: 现在,在onCreate上,您将使用新的LoginManager类进行所有不需要UI的登录调用,如下面的文档示例中的示例所示:

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

You can always see all changes and docs for the new SDK here 您始终可以在此处查看新SDK的所有更改和文档

UPDATE: Here is an example on how to pass permissions using Array.AsList(); 更新:这是一个如何使用Array.AsList();传递权限的示例Array.AsList();

... logInWithReadPermissions(this, Arrays.asList("public_profile", "email"); ... logInWithReadPermissions(this, Arrays.asList("public_profile", "email");

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM