应用程序在启动 facebook 活动时强制关闭

Posted

技术标签:

【中文标题】应用程序在启动 facebook 活动时强制关闭【英文标题】:app forcecloses on starting facebook activity 【发布时间】:2015-06-24 10:39:09 【问题描述】:

我已经在我的 android studio 项目中集成了 facebook sdk,但是一旦我运行应用程序,应用程序强制就会关闭。 在我使用 com.facebook.login.widget.LoginButton 的设计器中出现 json 异常错误,但这只是一个设计器错误。

错误日志:

> 04-17 19:29:35.996  24734-24734/com.example.bandhan.myapplication1
> E/AndroidRuntime﹕ FATAL EXCEPTION: main
>     Process: com.example.bandhan.myapplication1, PID: 24734
>     java.lang.ExceptionInInitializerError
>             at java.lang.reflect.Constructor.newInstance(Native Method)
>             at java.lang.reflect.Constructor.newInstance(Constructor.java:288)
>             at android.view.LayoutInflater.createView(LayoutInflater.java:614)
>             at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:750)
>             at android.view.LayoutInflater.rInflate(LayoutInflater.java:813)
>             at android.view.LayoutInflater.inflate(LayoutInflater.java:511)
>             at android.view.LayoutInflater.inflate(LayoutInflater.java:415)
>             at android.view.LayoutInflater.inflate(LayoutInflater.java:366)
>             at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:435)
>             at android.app.Activity.setContentView(Activity.java:2267)
>             at com.example.bandhan.myapplication1.Share_Activity.onCreate(Share_Activity.java:15)
>             at android.app.Activity.performCreate(Activity.java:6289)
>             at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
>             at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
>             at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2760)
>             at android.app.ActivityThread.access$900(ActivityThread.java:177)
>             at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1448)
>             at android.os.Handler.dispatchMessage(Handler.java:102)
>             at android.os.Looper.loop(Looper.java:145)
>             at android.app.ActivityThread.main(ActivityThread.java:5944)
>             at java.lang.reflect.Method.invoke(Native Method)
>             at java.lang.reflect.Method.invoke(Method.java:372)
>             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1389)
>             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1184)
>      Caused by: null
>             at com.facebook.internal.Validate.sdkInitialized(Validate.java:99)
>             at com.facebook.FacebookSdk.getCallbackRequestCodeOffset(FacebookSdk.java:735)
>             at com.facebook.internal.CallbackManagerImpl$RequestCodeOffset.toRequestCode(CallbackManagerImpl.java:109)
>             at com.facebook.login.widget.LoginButton.<clinit>(LoginButton.java:58)
>             at java.lang.reflect.Constructor.newInstance(Native Method)
>             at java.lang.reflect.Constructor.newInstance(Constructor.java:288)
>             at android.view.LayoutInflater.createView(LayoutInflater.java:614)
>             at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:750)
>             at android.view.LayoutInflater.rInflate(LayoutInflater.java:813)
>             at android.view.LayoutInflater.inflate(LayoutInflater.java:511)
>             at android.view.LayoutInflater.inflate(LayoutInflater.java:415)
>             at android.view.LayoutInflater.inflate(LayoutInflater.java:366)
>             at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:435)
>             at android.app.Activity.setContentView(Activity.java:2267)
>             at com.example.bandhan.myapplication1.Share_Activity.onCreate(Share_Activity.java:15)
>             at android.app.Activity.performCreate(Activity.java:6289)
>             at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
>             at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
>             at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2760)
>             at android.app.ActivityThread.access$900(ActivityThread.java:177)
>             at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1448)
>             at android.os.Handler.dispatchMessage(Handler.java:102)
>             at android.os.Looper.loop(Looper.java:145)
>             at android.app.ActivityThread.main(ActivityThread.java:5944)
>             at java.lang.reflect.Method.invoke(Native Method)
>             at java.lang.reflect.Method.invoke(Method.java:372)
>             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1389)
>             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1184)

请帮我解决问题。 谢谢。

【问题讨论】:

【参考方案1】:

如果您查看 Facebook 的 Validate 类中的第 99 行,您会看到它正在抛出 FacebookSdkNotInitializedException

你需要在你的LoginButton被加载之前调用FacebookSdk.sdkInitialize(Context)(即你调用setContentView()

所以,在您的ActivityonCreate 方法中:

public void onCreate(Bundle savedInstance)
    super.onCreate(savedInstance);
    FacebookSdk.sdkInitialize(getApplicationContext());
    setContentView(R.layout.my_layout); // Now you can set the layout with the LoginButton

无论何时您要使用 Facebook 组件,都需要确保 SDK 已初始化。

还要确保您的清单中有 Facebook 应用程序 ID 的元数据密钥,否则当您尝试实际按下 LoginButton 时会遇到另一个问题。

【讨论】:

是的,你没看错。这就像一个魅力。但问题是我不能在 xml 中使用 fb:fetch_user 数据,在 java 文件中使用 uilifecycle。其他一切都很完美。谢谢。 只要在添加包含 Facebook 数据的 XML 之前调用 FacebookSdk.sdkInitialize 就可以了 实际上 xml 中的 fb:fetch_user 数据和 java 文件中的 uilifecycle 没有从库中获取。顺便说一句,我正在使用最新版本的 fbsdk。谢谢 这行得通,但我对 Facebook 为我们构建平台的开发人员提供的低级文档感到非常难过!糟透了!【参考方案2】:

老实说,这个解决方案并不是万无一失的。

即使我在 setContentView() 之前调用了初始化代码,我仍然会收到有关该异常的报告。

您还可以添加一个 if 条件以确保 Facebook 已完成初始化。

if (FacebookSdk.isInitialized()) // 在此处邀请您的应用

【讨论】:

以上是关于应用程序在启动 facebook 活动时强制关闭的主要内容,如果未能解决你的问题,请参考以下文章

使用适用于 Android 的 Facebook Unity SDK 登录 facebook 时应用程序强制关闭

内存不足时Android应用程序强制关闭

当应用程序关闭并重新启动时,如何继续上一个活动?

应用程序在按下后退键时强制关闭

在运行 Android 模拟器时强制关闭应用程序错误

如何强制 iOS 应用以纵向模式启动