android - 帶有Facebook登錄示例的java.lang.RuntimeException




multithreading android-asynctask (4)

我正在關注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)

Answers

你需要添加

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

在應用程序內的正確位置,而不是活動內部


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

在我的情況下失踪了。


問題不是來自您的代碼,而是來自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添加到strings.xml文件中(從您的Facebook開發者帳戶的設置頁面中找到該應用程序ID在您的Facebook開發者帳戶中。

一旦你完成了它應該編譯


把你需要的相機中的所有方法放在一個界面中,然後像這樣創建一個相機實例

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        Log.d(TAG, "camera2 selected");
        this.camera = new Camera2(getContext());
    } else {
        Log.d(TAG, "camera1 selected");
        this.camera = new Camera1(getContext());
    }

這樣你就可以分開一切,它會讓你的生活變得更加輕鬆。

建議 - 用camera2生活並不是那麼好。 供應商仍然會製造垃圾實施,因此您必須添加許多條件和解決方法。

示例1 - S6報告說它不支持閃存:)示例2 - LG設備報告支持的圖像大小列表 - 但是並非所有的圖像大小都受到實際支持!





java android facebook multithreading android-asynctask