java.lang.RuntimeException with Facebook Login example

我正在按照Facebook指南为Android制作登录应用程序。后:

  1. 在虚拟设备上安装Facebook应用程序(不必要)
  2. 将 Facebook SDK 作为模块导入 Android Studio
  3. 将上一个模块导入到项目中,然后
  4. 按照指南所述修改代码

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

不幸的是,该应用程序已停止。

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

我使用Android 0.5.8,Oracle JDK 7和API 16作为目标最小值和最大值

主要文件是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的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添加到字符串.xml文件(从 Facebook 开发者帐户的设置页面中找到)应用 ID 位于您的 facebook 开发者帐户上。

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


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

在我的情况下失踪了。