Facebook Android SDK v4.0.0 ShareDialog NullPointerException问题

时间:2015-03-27 10:53:04

标签: android facebook-android-sdk

根据这些说明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()'在null对象引用上   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):在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):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)

是以下代码,

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

的错误

3 个答案:

答案 0 :(得分:19)

(希望FB的某人会读到这个)

除了Gokhan Caglar给出的(正确)建议外,还要注意:不要将app-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中未定义的app-id”将是令人满意的。

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

答案 1 :(得分:14)

您还需要添加如下的应用程序ID:

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

答案 2 :(得分:1)

不要在meta

中写facebook键

将其写入字符串并在清单

中的元中引用它

喜欢这样

<string name="id_facebook">id_facebook</string>

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

希望这有助于:)