Facebook Android SDK v4.0.0 ShareDialog NullPointerException问题

Facebook Android SDK v4.0.0 ShareDialog NullPointerException issue

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

03-27 16:12:53.150: E/AndroidRuntime(10275): FATAL EXCEPTION: main
03-27 16:12:53.150: E/AndroidRuntime(10275): Process: au.com.elegantmedia.emotit, PID: 10275
03-27 16:12:53.150: E/AndroidRuntime(10275): java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Object.hashCode()' on a null object reference
03-27 16:12:53.150: E/AndroidRuntime(10275): at java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:746)
03-27 16:12:53.150: E/AndroidRuntime(10275): at com.facebook.internal.Utility.getDialogFeatureConfig(Utility.java:859)
03-27 16:12:53.150: E/AndroidRuntime(10275): at com.facebook.internal.DialogPresenter.getVersionSpecForFeature(DialogPresenter.java:248)
03-27 16:12:53.150: E/AndroidRuntime(10275): at com.facebook.internal.DialogPresenter.getProtocolVersionForNativeDialog(DialogPresenter.java:234)
03-27 16:12:53.150: E/AndroidRuntime(10275): at 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): at 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): at android.widget.AdapterView.performItemClick(AdapterView.java:300)
03-27 16:12:53.150: E/AndroidRuntime(10275): at android.widget.AbsListView.performItemClick(AbsListView.java:1143)
03-27 16:12:53.150: E/AndroidRuntime(10275): at android.widget.AbsListView$PerformClick.run(AbsListView.java:3044)
03-27 16:12:53.150: E/AndroidRuntime(10275): at android.widget.AbsListView$3.run(AbsListView.java:3833)
03-27 16:12:53.150: E/AndroidRuntime(10275): at android.os.Handler.handleCallback(Handler.java:739)
03-27 16:12:53.150: E/AndroidRuntime(10275): at android.os.Handler.dispatchMessage(Handler.java:95)
03-27 16:12:53.150: E/AndroidRuntime(10275): at android.os.Looper.loop(Looper.java:135)
03-27 16:12:53.150: E/AndroidRuntime(10275): at android.app.ActivityThread.main(ActivityThread.java:5221)
03-27 16:12:53.150: E/AndroidRuntime(10275): at java.lang.reflect.Method.invoke(Native Method)
03-27 16:12:53.150: E/AndroidRuntime(10275): at java.lang.reflect.Method.invoke(Method.java:372)
03-27 16:12:53.150: E/AndroidRuntime(10275): at 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)

是下面的代码,

1
FetchedAppSettings settings = fetchedAppSettings.get(applicationId);

fetchedAppSettings-{}applicationId-null都未初始化。

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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");
        }
    });

中的

并调用

1
2
3
4
5
6
7
8
9
10
11
12
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的某种错误?


(希望FB的人可以阅读此内容)

除了Gokhan Caglar提供的(正确)建议外,还请注意以下几点:不要将应用程序ID号直接写入AndroidManifest.xml!为了使FB正常运行,还必须根据最佳实践在文件strings.xml

中正确定义app-id。

因为在提供者标签下也使用了app-id,但是直接将其作为数字,所以我也做了捷径,将app-id的数字也直接写到了元数据标签中。巨大的错误,已经过去了2天。

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

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

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

  • 当应用程序定义不正确时,将更好的错误报告系统作为覆盖层。像这样的FB内部深处的空异常很快就会成为您每天的时间小偷。在这种情况下,类型为"错误:未在strings.xml中定义的应用程序ID"的错误报告将令人满意。

  • 关于本教程,它也包含一个陷阱,因此我要提一下:如果您已经在插入密钥哈希之后在此处运行本教程:https://developers.facebook.com/quickstarts/?platform=android对于开发来说,如果事情不起作用,您可以轻松地执行一些操作,然后请注意,本教程将删除(或替换)应用程序定义中的重要信息,而无需告诉您。由于您可能已经定义了密钥哈希,因此您无需在本快速入门指南中再次填写密钥哈希。因此,稍后您发现密钥哈希已消失,并想知道为什么。


您还需要添加应用程序ID,如下所示:

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


请勿在meta

中写入Facebook密钥

将其写入字符串并在manifest

中的meta中引用它

像这样

1
2
3
4
5
<string name="id_facebook">id_facebook</string>

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

希望这会有所帮助:)