带有 Facebook 登录示例的 java.lang.RuntimeException

Posted

技术标签:

【中文标题】带有 Facebook 登录示例的 java.lang.RuntimeException【英文标题】:java.lang.RuntimeException with Facebook Login example 【发布时间】:2014-07-19 17:37:46 【问题描述】:

我正在关注Facebook guide 为android 制作一个登录应用程序。之后:

    在虚拟设备上安装 Facebook 应用(不需要) 将 Facebook SDK 作为模块导入 Android Studio 将上一个模块导入项目并 按照指南修改代码

项目编译。但是当我运行机器并尝试打开应用程序时,它会崩溃显示:

很遗憾,应用程序已停止。

在阅读了this 和this 之类的类似帖子后,我找不到解决方案。

我使用 Android 0.5.8、Oracle JDK 7 和 API 16 作为 targetminmax

主要文件有activity_main.xmlMainActivity.javaMainFragment.java

这是最新的 logcat 输出:

05-30 03:15:54.127      647-664/com.jdk8.minifacebookloginapp.app E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
    java.lang.RuntimeException: An error occured while executing doInBackground()
            at android.os.AsyncTask$3.done(AsyncTask.java:299)
            at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
            at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
            at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
            at java.util.concurrent.FutureTask.run(FutureTask.java:137)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
            at java.lang.Thread.run(Thread.java:856)
     Caused by: java.lang.NullPointerException
            at java.util.concurrent.ConcurrentHashMap.containsKey(ConcurrentHashMap.java:781)
            at com.facebook.internal.Utility.queryAppSettings(Utility.java:372)
            at com.facebook.widget.LoginButton$1.doInBackground(LoginButton.java:676)
            at com.facebook.widget.LoginButton$1.doInBackground(LoginButton.java:673)
            at android.os.AsyncTask$2.call(AsyncTask.java:287)
            at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
            at java.util.concurrent.FutureTask.run(FutureTask.java:137)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
            at java.lang.Thread.run(Thread.java:856)

【问题讨论】:

【参考方案1】:

问题不是来自您的代码,而是来自 facebook SDK。您可以通过查看 NullPointerException 的顶部来判断

Caused by: java.lang.NullPointerException
        at java.util.concurrent.ConcurrentHashMap.containsKey(ConcurrentHashMap.java:781)
        at com.facebook.internal.Utility.queryAppSettings(Utility.java:372)

最后两个触发行的错误来自 facebook sdk (com.facebook.internal) 和您的 java.util 包,它们都不是来自您的代码。

要解决此问题,您需要在 facebook 的 getting started android 教程中完成设置,在生成 android 密钥哈希后注册您的应用程序。完成后,打开您的 AndroidManifest.xml 并添加 元数据行

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/app_id"/>
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

然后将您的 app_id 添加到 strings.xml 文件中(可从 your facebook developer account 的设置页面中找到 应用 ID 在您的 Facebook 开发者帐户中。

完成此操作后,它应该可以编译

【讨论】:

你是对的。但我仍然缺少一些东西。应用程序启动,但是当我单击“登录”按钮时它崩溃了。它给出了this error,但我认为这是另一个问题(我应该创建另一个问题)。这有关系吗? 我用here和here提到的过程解决了之前的错误。 这是我的问题,这解决了它。 :) 这太完美了!为什么在 facebook 开发者页面上从来没有提到过这个? @Todd Anderson 能否提供 facebook 按钮小部件和登录的示例应用程序【参考方案2】:
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/>

在我的情况下丢失了。

【讨论】:

【参考方案3】:

你需要添加

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

在应用程序内部的正确位置而不是在活动内部

【讨论】:

以上是关于带有 Facebook 登录示例的 java.lang.RuntimeException的主要内容,如果未能解决你的问题,请参考以下文章

使用 accesstoken 登录 Facebook

如何为带有插槽的 vuejs 配置 facebook 插件

cordova-plugin-facebook4 - 带有“未登录:您尚未登录。请登录并重试”的空白对话框

如果“SignInWithFacebook”不再可用,我该如何创建一个带有firebase的facebook登录页面?

带有 Facebook 单点登录的 iOS 应用程序中的“点赞”按钮

Facebook 登录不会返回到带有 Xcode 7 iOS 9 的应用程序