Android Facebook SDK (4.31.0) - CustomTabLoginMethodHandler 中的 ActivityNotFoundException

Android Facebook SDK (4.31.0) - ActivityNotFoundException in CustomTabLoginMethodHandler

自从我们使用更新的 Facebook SDK 部署了 Android 应用程序的新版本后,我们发现许多用户在 Facebook 登录时崩溃。它不会在我们的设备上重现。

崩溃和堆栈跟踪:

Caused by android.content.ActivityNotFoundException
Unable to find explicit activity class {<our_app_id>/com.facebook.e}; have you declared this activity in your AndroidManifest.xml?

    android.app.Instrumentation.checkStartActivityResult (Instrumentation.java:1850)
    android.support.v4.app.Fragment.startActivityForResult (Fragment.java:916)
    com.facebook.login.CustomTabLoginMethodHandler.tryAuthorize (CustomTabLoginMethodHandler.java:102)
    com.facebook.login.LoginClient.tryCurrentHandler (LoginClient.java:255)
    com.facebook.login.LoginClient.tryNextHandler (LoginClient.java:217)
    com.facebook.login.LoginClient.authorize (LoginClient.java:122)
    com.facebook.login.LoginClient.startOrContinueAuth (LoginClient.java:103)
    com.facebook.login.LoginFragment.onResume (LoginFragment.java:154)
    android.support.v4.app.Fragment.performResume (Fragment.java:2308)
    com.android.internal.os.ZygoteInit.main (ZygoteInit.java:832)

知道可能导致崩溃的原因以及如何修复吗?

=== 编辑 ===

请注意只有部分 用户崩溃,在本地测试时我们似乎可以正常登录。

我们按照官方文档中的建议在清单中定义了 Facebook 活动:

<activity
    android:name="com.facebook.FacebookActivity"
    android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
    android:label="@string/app_name"/>
<activity
    android:name="com.facebook.CustomTabActivity"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.VIEW"/>

        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="android.intent.category.BROWSABLE"/>

        <data android:scheme="@string/fb_login_protocol_scheme"/>
    </intent-filter>
</activity>
<meta-data
    android:name="com.facebook.sdk.ApplicationId"
    android:value="@string/facebook_app_id"/>

从堆栈跟踪和 Facebook SDK sources 看来 com.facebook.ecom.facebook.CustomTabMainActivity 的混淆名称。我不知道 Facebook SDK 在什么情况下会调用此 Activity,但如果调用它,则应在 AndroidManifest.xml 中定义它。

因为你的manifest里面没有定义,所以不会混淆。

根据this link,您的清单中缺少的部分是:

<activity
    android:name="com.facebook.CustomTabMainActivity"
    android:exported="true">
</activity>

您是否在如下清单文件中声明了 FacebookActivity

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

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

Referrence