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[=21=](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.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)
就是下面这段代码,
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
?
您还需要像这样添加应用程序 ID:
<application android:label="@string/app_name" ...>
...
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/>
...
</application>
(希望 FB 的人会看到这篇文章)
除了Gokhan Caglar给出的(正确的)建议外,还要注意:不要将app-id号直接写入AndroidManifest.xml!为了使 FB 正常工作,还必须根据文件 strings.xml
中的最佳实践正确定义 app-id
因为app-id也用在provider标签下,但是直接作为数字,所以我也做了直接把app-id号写到meta-data标签的快捷方式。大错,2天过去了。
看起来,FB 将使用从 AndroidManifest.xml 和直接基于 strings.xml 中的定义获取的应用程序 ID。两者都必须存在。 app-id 必须在 strings.xml 中定义。这解决了问题。
对于 FB 开发团队,一些可以节省人们时间的建议:
要么去掉这种对app-id过于严格的使用,要么在教程中说明这是唯一的方法。 (比Android本身还要严格)
当应用程序定义不正确时,制作一个更好的错误报告系统作为覆盖。像这样深藏在 FB 中的空异常很快就会成为你今天的时间小偷。在这种情况下,类型的错误报告:“错误:app-id 未在 strings.xml 中定义”就可以了。
关于教程,它也包含一个陷阱,所以我提到它:如果你运行这里的教程:https://developers.facebook.com/quickstarts/?platform=android,在你已经插入密钥散列之后对于开发,如果事情不起作用,您可以轻松地做一些事情,然后请注意,本教程将删除(或更确切地说是替换)应用程序定义中的重要信息,而不会告诉您。由于您可能已经定义了 keyhash,因此您不会在本快速入门指南中再次填写它。因此,稍后您发现密钥散列不见了,想知道为什么。
不要在 meta 中写入 facebook 密钥
写成字符串并在manifest中的meta中引用
喜欢
<string name="id_facebook">id_facebook</string>
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="@string/id_facebook" />
希望这对您有所帮助:)
按照这些说明 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[=21=](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.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)
就是下面这段代码,
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
?
您还需要像这样添加应用程序 ID:
<application android:label="@string/app_name" ...>
...
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/>
...
</application>
(希望 FB 的人会看到这篇文章)
除了Gokhan Caglar给出的(正确的)建议外,还要注意:不要将app-id号直接写入AndroidManifest.xml!为了使 FB 正常工作,还必须根据文件 strings.xml
中的最佳实践正确定义 app-id因为app-id也用在provider标签下,但是直接作为数字,所以我也做了直接把app-id号写到meta-data标签的快捷方式。大错,2天过去了。
看起来,FB 将使用从 AndroidManifest.xml 和直接基于 strings.xml 中的定义获取的应用程序 ID。两者都必须存在。 app-id 必须在 strings.xml 中定义。这解决了问题。
对于 FB 开发团队,一些可以节省人们时间的建议:
要么去掉这种对app-id过于严格的使用,要么在教程中说明这是唯一的方法。 (比Android本身还要严格)
当应用程序定义不正确时,制作一个更好的错误报告系统作为覆盖。像这样深藏在 FB 中的空异常很快就会成为你今天的时间小偷。在这种情况下,类型的错误报告:“错误:app-id 未在 strings.xml 中定义”就可以了。
关于教程,它也包含一个陷阱,所以我提到它:如果你运行这里的教程:https://developers.facebook.com/quickstarts/?platform=android,在你已经插入密钥散列之后对于开发,如果事情不起作用,您可以轻松地做一些事情,然后请注意,本教程将删除(或更确切地说是替换)应用程序定义中的重要信息,而不会告诉您。由于您可能已经定义了 keyhash,因此您不会在本快速入门指南中再次填写它。因此,稍后您发现密钥散列不见了,想知道为什么。
不要在 meta 中写入 facebook 密钥
写成字符串并在manifest中的meta中引用
喜欢
<string name="id_facebook">id_facebook</string>
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="@string/id_facebook" />
希望这对您有所帮助:)