Facebook Android SDK & java.lang.NullPointerException
Posted
技术标签:
【中文标题】Facebook Android SDK & java.lang.NullPointerException【英文标题】: 【发布时间】:2013-09-03 04:02:08 【问题描述】:按照https://developers.facebook.com/docs/android/getting-started/facebook-sdk-for-android/ 上发布的教程,我无法在我的 android 应用中打开活动的 facebook 会话
我已经为此苦苦挣扎了很长一段时间,但没有任何运气!如果你们中的一个人能指出我正确的方向,我会很高兴! (我敢打赌,错误是我的一些设置,但我无法发现它)
这是我在活动的 onCreate 中调用 Session.openActiveSession(this, true, new Session.StatusCallback() 后看到的错误(我几乎遵循 facevook 开发人员教程中给出的步骤)
编辑: 首先记录以下警告消息,然后在随后的屏幕截图中显示错误消息
09-03 19:26:22.726:W/Bundle(17458):密钥 com.facebook.platform.protocol.PROTOCOL_VERSION 应为字符串,但 值是 java.lang.Integer。已返回默认值。 09-03 19:26:22.736: W/Bundle(17458): 尝试投射生成 内部异常:09-03 19:26:22.736:W/Bundle(17458): java.lang.ClassCastException:java.lang.Integer 不能转换为 java.lang.String 09-03 19:26:22.736: W/Bundle(17458): 在 android.os.Bundle.getString(Bundle.java:1061) 09-03 19:26:22.736: 带捆绑包(17458):在 android.content.Intent.getStringExtra(Intent.java:4466) 09-03 19:26:22.736:W/Bundle(17458):在 com.facebook.AuthorizationClient$KatanaLoginDialogAuthHandler.tryAuthorize(AuthorizationClient.java:821) 09-03 19:26:22.736:W/Bundle(17458):在 com.facebook.AuthorizationClient.tryCurrentHandler(AuthorizationClient.java:272)
09-02 22:55:04.110:E/AndroidRuntime(13287):致命异常:主要 09-02 22:55:04.110: E/AndroidRuntime(13287): java.lang.RuntimeException: 无法恢复活动 com.good.amrfbintegration/com.facebook.LoginActivity: java.lang.NullPointerException 09-02 22:55:04.110: E/AndroidRuntime(13287):在 android.app.ActivityThread.performResumeActivity(ActivityThread.java:3036) 09-02 22:55:04.110:E/AndroidRuntime(13287):在 android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3077) 09-02 22:55:04.110:E/AndroidRuntime(13287):在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2373)
这是我到目前为止所做的事情
用以下信息更新了 Facebook 上的应用程序(我使用了使用我机器的调试密钥库生成的 hashkey)
这是我的清单文件中的相关信息(@string/app_id 是来自 facebook 开发门户的 App Id)
我以这种方式在我的项目中添加了对 Facebook SDK 的引用
这是我的主要活动的 OnCreate 方法中的代码
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
activity = this;
Session.openActiveSession(this, true, new Session.StatusCallback()
@Override
public void call(Session session, SessionState state, Exception exception)
if (session.isOpened())
Toast.makeText(activity, "Connected to Fb", Toast.LENGTH_SHORT).show();
);
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
super.onActivityResult(requestCode, resultCode, data);
Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
在执行 Session.openActiveSession 时,logcat 会显示我的第一个屏幕截图中显示的错误。
Session.StatusCallback() 的调用方法被执行一次(而会话的状态为“正在打开”),但应用程序在随后的时间崩溃。这是我在应用崩溃之前看到的内容
任何帮助将不胜感激!
【问题讨论】:
可能是因为 Proguard。在我启用 Proguard 之前,它在我的所有设备上都能完美运行。我仍然不幸地处理这个问题。如果你找到了出路,请告诉我.. 我今天遇到了同样的问题。这是由于清单中的 APP_ID 不匹配。 com.facebook.platform.protocol.PROTOCOL_VERSION 应为字符串,但值为 java.lang.Integer。已返回默认值。 您找出问题所在了吗?几天来我一直遇到同样的问题,我正在努力弄清楚发生了什么。 Tony - 明天,我将发布在我的应用程序上运行良好的代码 sn-p(我很生气告诉这个...但是 YMMV)。此外,我认为羚羊的以下解决方案可能是您应该尝试的.. 好吧,我更新了我的应用程序以使用最新的 facebook SDK (3.5.2) 并且身份验证现在似乎工作正常 【参考方案1】:这个问题是因为 Facebook SDK,请从这里下载并使用 Facebook SDK 3.5.2 网址:-https://developers.facebook.com/docs/android/
【讨论】:
【参考方案2】:是的。检查您的代码,
确保你在 Manifest.xml 中有这些东西
<activity android:name="com.facebook.LoginActivity"/>
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/app_id"/>
@string/app_id 应该包含您从 Facebook 应用配置详细信息中获得的 app_id。你也应该在那里放置正确的 keyhash。
所以请确保 -
-
您的密钥哈希正确
您已在 Web 上正确配置应用程序,并注意将应用程序 ID 放入您的应用程序配置中。
【讨论】:
【参考方案3】:今天我也遇到了。
我的问题是 Facebook 应用程序处于沙盒模式。所以只有开发人员和测试人员可以使用它。
从您应用的 Facebook 开发者属性页面更改它: https://developers.facebook.com/apps
还在这里找到了我的答案: Can not access Facebook session - UnknownError: Invalid application
【讨论】:
【参考方案4】:// Just write your code in onResume() rather than onCreate().
@Override
public void onResume()
super.onResume();
if(Session.getActiveSession()==null)
session = new Session(this);
Session.setActiveSession(session);
if (Session.getActiveSession().isOpened())
Toast.makeText(activity, "Connected to Fb", Toast.LENGTH_SHORT).show();
else
Session.openActiveSession(this, true, new Session.StatusCallback()
@Override
public void call(Session session, SessionState state, Exception exception)
if (session.isOpened())
Toast.makeText(activity, "Connected to Fb", Toast.LENGTH_SHORT).show();
);
【讨论】:
它没有修复它 - 我遇到了同样的错误! developers.facebook.com/docs/android/getting-started/中的示例应用程序也在 OnCreate 方法中进行【参考方案5】:我对 SDK (3.5) 进行了一些研究,似乎 EXTRA_PROTOCOL_VERSION 始终存储为整数而不是字符串。 IE。在 NativeProtocol.java 中:
public static Intent createPlatformActivityIntent(Context context, String action, int version, Bundle extras)
Intent intent = new Intent()
.setAction(INTENT_ACTION_PLATFORM_ACTIVITY)
.setPackage(FACEBOOK_PACKAGE)
.addCategory(Intent.CATEGORY_DEFAULT)
.putExtras(extras)
.putExtra(EXTRA_PROTOCOL_VERSION, version) //version --> int
.putExtra(EXTRA_PROTOCOL_ACTION, action);
return validateKatanaActivityIntent(context, intent);
public static Intent createPlatformServiceIntent(Context context)
Intent intent = new Intent(INTENT_ACTION_PLATFORM_SERVICE)
.setPackage(FACEBOOK_PACKAGE)
.addCategory(Intent.CATEGORY_DEFAULT);
return validateKatanaServiceIntent(context, intent);
public static Intent createLoginDialog20121101Intent(Context context, String applicationId, ArrayList<String> permissions,
String audience)
Intent intent = new Intent()
.setAction(INTENT_ACTION_PLATFORM_ACTIVITY)
.setPackage(FACEBOOK_PACKAGE)
.addCategory(Intent.CATEGORY_DEFAULT)
.putExtra(EXTRA_PROTOCOL_VERSION, PROTOCOL_VERSION_20121101) // PROTOCOL_VERSION_20121101 --> int
.putExtra(EXTRA_PROTOCOL_ACTION, ACTION_LOGIN_DIALOG)
.putExtra(EXTRA_APPLICATION_ID, applicationId)
.putStringArrayListExtra(EXTRA_PERMISSIONS, ensureDefaultPermissions(permissions))
.putExtra(EXTRA_PROTOCOL_CALL_ID, generateCallId())
.putExtra(EXTRA_WRITE_PRIVACY, ensureDefaultAudience(audience));
return validateKatanaActivityIntent(context, intent);
并且在开发人员通常会收到此错误的地方被读取为字符串(AuthorizationCLient.java l:820):
addLoggingExtra(EVENT_EXTRAS_PROTOCOL_VERSION,
intent.getStringExtra(NativeProtocol.EXTRA_PROTOCOL_VERSION));
这在任何情况下都不起作用,因此它仍然是 SDK 中的一个错误。只是在某些情况下,该段被执行。
有没有cmets?
【讨论】:
用 int 输入创建一个新函数,在这种情况下通常可以工作,不是吗?我正在处理同样的问题...【参考方案6】:我遇到了同样的错误,谷歌搜索了很多东西,最后这就是我为摆脱这个错误所做的事情
private void getHashKey()
PackageInfo info;
try
info = getPackageManager().getPackageInfo("Your_Package_Name", PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) MessageDigest md;
md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
//String something = new String(Base64.encode(md.digest(), 0));
String something = new String(Base64.encode(md.digest(),0));
Log.e("** Hash Key", something);
catch (NameNotFoundException e1)
Log.e("name not found", e1.toString());
catch (NoSuchAlgorithmException e)
Log.e("no such an algorithm", e.toString());
catch (Exception e)
Log.e("exception", e.toString());
所以,我使用了这段代码生成的 Hash_Key,并在我的 facebook 开发者控制台中更新了它。这解决了我的问题。可能是 windows key_gen 或 android key_store 的一些问题
另外,请在第 820 行从 Facebook Sdk 检查您的 AuthorizationClient.java 文件
addLoggingExtra(EVENT_EXTRAS_PROTOCOL_VERSION,"" +
intent.getIntExtra(NativeProtocol.EXTRA_PROTOCOL_VERSION, 0));
我到达了“getIntExtra”,他们将其命名为“getStringExtra”。做出这些改变,对我有用。 希望它也对你有用。
【讨论】:
以上是关于Facebook Android SDK & java.lang.NullPointerException的主要内容,如果未能解决你的问题,请参考以下文章
添加 Facebook sdk 和 Google Firebase sdk 时的 Android Proguard 问题(重复)
在 Facebook SDK Android 上找不到文件“com.facebook.android.facebook”
无法使用 Facebook Android SDK 和 Facebook Audience Network SDK 编译
通过 Xamarin.Facebook.Android sdk 登录 Facebook