【问题标题】:Facebook Android SDK v4.0.0 ShareDialog NullPointerException issueFacebook Android SDK v4.0.0 ShareDialog NullPointerException 问题
【发布时间】:2015-05-31 16:21:27
【问题描述】:

按照这些说明 https://developers.facebook.com/docs/sharing/android 我已经实现了 Facebook ShareDialog 以显示在我的应用程序中,但它导致了以下错误。

03-27 16:12:53.150:E/AndroidRuntime(10275):致命异常:主要 03-27 16:12:53.150: E/AndroidRuntime(10275): 进程: au.com.elegantmedia.emotit, PID: 10275 03-27 16:12:53.150: E/AndroidRuntime(10275): java.lang.NullPointerException: 尝试在空对象引用上调用虚拟方法“int java.lang.Object.hashCode()” 03-27 16:12:53.150: E/AndroidRuntime(10275): 在 java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:746) 03-27 16:12:53.150: E/AndroidRuntime(10275): 在 com.facebook.internal.Utility.getDialogFeatureConfig(Utility.java:859) 03-27 16:12:53.150: E/AndroidRuntime(10275): 在 com.facebook.internal.DialogPresenter.getVersionSpecForFeature(DialogPresenter.java:248) 03-27 16:12:53.150: E/AndroidRuntime(10275): 在 com.facebook.internal.DialogPresenter.getProtocolVersionForNativeDialog(DialogPresenter.java:234) 03-27 16:12:53.150: E/AndroidRuntime(10275): 在 com.facebook.internal.DialogPresenter.canPresentNativeDialogWithFeature(DialogPresenter.java:75) 03-27 16:12:53.150: E/AndroidRuntime(10275): at com.facebook.share.widget.ShareDialog.canShowNative(ShareDialog.java:133) 03-27 16:12:53.150: E/AndroidRuntime(10275): at com.facebook.share.widget.ShareDialog.access$0(ShareDialog.java:130) 03-27 16:12:53.150: E/AndroidRuntime(10275): at com.facebook.share.widget.ShareDialog$NativeHandler.canShow(ShareDialog.java:241) 03-27 16:12:53.150: E/AndroidRuntime(10275): at com.facebook.share.widget.ShareDialog$NativeHandler.canShow(ShareDialog.java:1) 03-27 16:12:53.150: E/AndroidRuntime(10275): 在 com.facebook.internal.FacebookDialogBase.createAppCallForMode(FacebookDialogBase.java:184) 03-27 16:12:53.150: E/AndroidRuntime(10275): at com.facebook.internal.FacebookDialogBase.showImpl(FacebookDialogBase.java:147) 03-27 16:12:53.150: E/AndroidRuntime(10275): at com.facebook.internal.FacebookDialogBase.show(FacebookDialogBase.java:142) 03-27 16:12:53.150: E/AndroidRuntime(10275): at au.com.elegantmedia.emotit.activities.MainActivity.onTellAFriendClick(MainActivity.java:299) 03-27 16:12:53.150: E/AndroidRuntime(10275): at au.com.elegantmedia.emotit.activities.MainActivity.onItemClick(MainActivity.java:194) 03-27 16:12:53.150: E/AndroidRuntime(10275): 在 android.widget.AdapterView.performItemClick(AdapterView.java:300) 03-27 16:12:53.150: E/AndroidRuntime(10275): 在 android.widget.AbsListView.performItemClick(AbsListView.java:1143) 03-27 16:12:53.150: E/AndroidRuntime(10275): 在 android.widget.AbsListView$PerformClick.run(AbsListView.java:3044) 03-27 16:12:53.150: E/AndroidRuntime(10275): 在 android.widget.AbsListView$3.run(AbsListView.java:3833) 03-27 16:12:53.150: E/AndroidRuntime(10275): 在 android.os.Handler.handleCallback(Handler.java:739) 03-27 16:12:53.150: E/AndroidRuntime(10275): 在 android.os.Handler.dispatchMessage(Handler.java:95) 03-27 16:12:53.150: E/AndroidRuntime(10275): 在 android.os.Looper.loop(Looper.java:135) 03-27 16:12:53.150: E/AndroidRuntime(10275): 在 android.app.ActivityThread.main(ActivityThread.java:5221) 03-27 16:12:53.150: E/AndroidRuntime(10275): 在 java.lang.reflect.Method.invoke(Native Method) 03-27 16:12:53.150: E/AndroidRuntime(10275): 在 java.lang.reflect.Method.invoke(Method.java:372) 03-27 16:12:53.150: E/AndroidRuntime(10275): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 03-27 16:12:53.150: E/AndroidRuntime(10275): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

在线,

03-27 16:12:53.150: E/AndroidRuntime(10275): at com.facebook.internal.Utility.getDialogFeatureConfig(Utility.java:859)

是下面这段代码,

FetchedAppSettings settings = fetchedAppSettings.get(applicationId);

fetchedAppSettings - {}applicationId - null 似乎都没有初始化。

applicationId 的唯一位置是在清单文件中。

<provider android:authorities="com.facebook.app.FacebookContentProviderXXX"
      android:name="com.facebook.FacebookContentProvider"
      android:exported="true"/>

XXX 是 applicationId,我已经正确地把它放在那里。其他所有事情也都完成了,例如,

FacebookSdk.sdkInitialize(getApplicationContext());

    callBackManager = CallbackManager.Factory.create();
    shareDialog = new ShareDialog(this);
    shareDialog.registerCallback(callBackManager, new FacebookCallback<Sharer.Result>() {

        @Override
        public void onSuccess(Result result) {
            ELog.d(LOG_TAG, "success");
        }

        @Override
        public void onError(FacebookException error) {
            ELog.d(LOG_TAG, "error");
        }

        @Override
        public void onCancel() {
            ELog.d(LOG_TAG, "cancel");
        }
    });

onCreate() 和呼叫中,

if (ShareDialog.canShow(ShareLinkContent.class)) {
        ShareLinkContent linkContent = new ShareLinkContent.Builder()
                .setContentTitle("Hello Facebook")
                .setContentDescription(
                        "The 'Hello Facebook' sample  showcases simple Facebook integration")
                .setContentUrl(
                        Uri.parse("http://developers.facebook.com/android"))
                .setImageUrl(Uri.parse("https://fbcdn-dragon-a.akamaihd.net/hphotos-ak-xfa1/t39.2178-6/11057086_1577191859234204_214246289_n.png"))
                .build();

        shareDialog.show(linkContent);
    }

当用户点击分享内容时。有什么我错过的吗?还是我在新的 SDK 中遇到了某种导致 NullPointerException 的错误?

【问题讨论】:

    标签: android facebook-android-sdk


    【解决方案1】:

    不要在元数据中写入 facebook 密钥

    将其写入字符串并在清单中的元数据中引用它

    像这样

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

    希望这会有所帮助:)

    【讨论】:

      【解决方案2】:

      (希望 FB 有人会读到这篇文章)

      除了 Gokhan Caglar 给出的(正确的)建议之外,还要注意这一点:不要将 app-id 号直接写入 AndroidManifest.xml!要使 FB 工作,还必须根据文件 strings.xml 中的最佳实践正确定义 app-id

      因为在provider标签下也使用了app-id,但是直接作为数字存在,所以我也做了将app-id数字直接写入meta-data标签的快捷方式。大错特错,2 天过去了。

      看起来,FB 将使用从 AndroidManifest.xml 中获取的 app-id,并直接基于 strings.xml 中的定义。两者都必须在那里。 app-id 必须在 strings.xml 中定义。这解决了问题。

      对于 FB 开发团队,有几点建议可以节省人们的时间:

      • 要么删除这种对 app-id 的过度严格使用,要么在教程中解释这是唯一的方法。 (比安卓本身更严格)

      • 当应用程序定义不正确时,制作一个更好的错误报告系统作为覆盖。像这样在 FB 深处出现的空异常很快就会成为你的时间小偷。在这种情况下,“错误:未在 strings.xml 中定义的 app-id”类型的错误报告将是令人满意的。

      • 关于教程,它也包含一个陷阱,所以我提到它:如果你在这里运行教程:https://developers.facebook.com/quickstarts/?platform=android,在你已经插入密钥散列用于开发之后,你可以很容易地做到这一点不工作,那么请注意本教程将删除(或更确切地说是替换)应用程序定义中的重要信息,而不会告诉您。由于您可能已经定义了 keyhash,因此您无需在本快速入门指南中再次填写它。因此,后来您发现 keyhash 消失了,并想知道为什么。

      【讨论】:

      • 今天大部分时间都在尝试实现 Facebook SDK,错误无数。 (我什至在 android 中达到了 64k 方法限制)。我希望他们重写它(或获得更好的开发人员),因为目前 facebook sdk 完全是垃圾软件。
      • 一百万年我都不会注意到这一点。谢谢!脸书?
      • 我遇到了问题(单击了共享但没有任何反应),结果发现我的应用设置中缺少密钥哈希!要修复它,您需要转到 Facebook 开发者页面 > 我的应用程序 > 选择应用程序 > 设置并检查密钥哈希是否仍然存在。它没有解决问题,但至少现在我知道 Key Hash 没有消失。
      • 谢谢谢谢谢谢。我的应用程序 ID 直接在导致问题的元标记中。
      • 谢谢!除了最佳实践之外,我不明白这有什么不同,我认为无论如何字符串都会在运行时转换......但谢谢这将浪费更多时间:)
      【解决方案3】:

      您还需要像这样添加应用程序 ID:

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

      【讨论】:

      • 谢谢 Gokhan。我实际上错过了两件事。你上面和下面提到的。 "" 我知道,这些东西来自以前的版本,但很遗憾链接中没有提到我在我的问题中提供了。经过多年的努力,我实际上正在尝试将 Facebook SDK 集成到 Android 应用程序中。
      • 你说得对,@JanithaR,我会确保更新文档,感谢您的反馈。
      • Gokhan Caglar 我在同一时间窃贼 +24 小时。我已经按照提到的链接进行了更新,并根据您的评论进行了更新。我仍然得到相同的空指针异常。这个错误还有其他原因吗?
      • @carl 你通过了吗:developers.facebook.com/docs/android/getting-started你能看到调试器中的空值吗?
      • 我有另一个应用程序与开发 keyhash 等配合良好,并尽我最大的努力进行了三次检查。因此非常奇怪。在有问题的应用程序中,我尝试:FacebookSdk.isInitialized() = true,我尝试 FacebookSdk.getApplicationId()= null,对于 .getApplicationName()=null 也是如此。似乎 FB 在developers.facebook.com/apps/xxxxx 找不到应用程序定义。您是否知道任何已知漏洞,例如Android目标/最低或类似?我也尝试在上述链接中删除和重新定义应用程序,没有变化。另一个应用程序正在使用 sdk3.7。我正在使用 Netbeans
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 2013-09-25
      相关资源
      最近更新 更多