签名APK集成Facebook登录后启动崩溃问题求助
我来帮你搞定这个Facebook登录后的崩溃问题!从你给出的日志能看出来,这是在把Facebook登录结果(请求码64206是Facebook默认的登录请求码)传递到OnBoardActivity时触发的NullPointerException,具体是尝试调用一个空的Throwable对象的toString()方法导致的。下面是几个针对性的排查和解决步骤:
检查签名APK的哈希密钥是否正确配置到Facebook后台
签名APK用的是你的发布密钥库,和调试用的密钥库不是同一个,很多人在这里搞混导致问题。你可以用下面的命令生成发布密钥的哈希值:keytool -exportcert -alias YOUR_RELEASE_ALIAS -keystore YOUR_RELEASE_KEYSTORE_PATH | openssl sha1 -binary | openssl base64把生成的哈希值添加到Facebook开发者后台对应应用的Android平台设置里的「Key Hashes」中,确保和签名APK的哈希完全匹配。
完善OnBoardActivity中登录结果的处理代码
在处理Facebook登录结果的代码里,一定要先做空值判断,避免因Intent data为空或者异常对象为空导致崩溃:
比如在onActivityResult方法中:@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // 先判断data是否为空 if (data == null) { Log.e("FacebookLogin", "登录结果Intent为空"); return; } // 再传递给Facebook SDK处理 LoginManager.getInstance().onActivityResult(requestCode, resultCode, data); }如果用的是
LoginButton的回调,在onError方法里也要先判断异常对象是否为空:loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() { @Override public void onSuccess(LoginResult loginResult) { // 处理登录成功逻辑 } @Override public void onCancel() { // 处理用户取消登录逻辑 } @Override public void onError(FacebookException error) { // 先判断error是否为空再调用toString() if (error != null) { Log.e("FacebookLoginError", error.toString()); } else { Log.e("FacebookLoginError", "发生未知登录错误"); } } });检查ProGuard混淆规则是否正确配置
如果你的签名APK开启了代码混淆,必须确保Facebook SDK的类不会被混淆,否则会导致SDK内部逻辑出错,引发空指针。在proguard-rules.pro文件中添加以下规则:-keep class com.facebook.** { *; } -keep interface com.facebook.** { *; } -keep enum com.facebook.** { *; }验证签名APK的包名是否和Facebook后台配置一致
确认Facebook开发者后台对应应用的Android平台设置里的「Package Name」和你签名APK的包名完全一致,包括大小写,包名不匹配也会导致登录流程异常。
按照上面的步骤逐一排查,大概率能解决这个崩溃问题!
内容的提问来源于stack exchange,提问作者ozonostudio

