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); |
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中遇到导致
(希望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" /> |
希望这会有所帮助:)