当我尝试在Kitkat上登录facebook时,我得到一个NPE,在Lollipop MR1上运行正常。我试过4.0.0和4.0.1
我的登录代码:
LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList(READ_PERMISSIONS));
崩溃是
java.lang.RuntimeException: Unable to start activity ComponentInfo{lt.segfoltas.psm/com.facebook.FacebookActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2198)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2257)
at android.app.ActivityThread.access$800(ActivityThread.java:139)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5086)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.facebook.login.LoginFragment.onCreate(LoginFragment.java:68)
at android.support.v4.app.Fragment.performCreate(Fragment.java:1763)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:915)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1136)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1499)
at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:548)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1194)
at android.app.Activity.performStart(Activity.java:5258)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2171)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2257)
at android.app.ActivityThread.access$800(ActivityThread.java:139)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5086)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)
相关的清单条目
<activity android:name="com.facebook.FacebookActivity"
android:configChanges=
"keyboard|keyboardHidden|screenLayout|screenSize|orientation"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:label="@string/app_name" />
App id设置在onCreate
中 FacebookSdk.setApplicationId(FacebookData.APP_ID);
FacebookSdk.sdkInitialize(getApplicationContext());
在登录后立即收到登录被取消的回复。然后应用程序崩溃了。
Facebook报告崩溃的代码:
this.callingPackage = this.getActivity().getCallingActivity().getPackageName();
我的权限:
private static final String[] READ_PERMISSIONS = new String[]{"public_profile", "user_events", "user_birthday", "email"};
答案 0 :(得分:3)
发现它崩溃了什么。如果调用活动设置为singleInstance,则登录方法会在Facebook的LoginFragment内崩溃。我不知道是否有解决方法。
编辑:
似乎Facebook部分修复了SDK 4.1中的问题
4.0有:
this.callingPackage = this.getActivity().getCallingActivity().getPackageName();
从singleInstance活动调用登录时会导致NPE。
现在,如果发生这种情况,LoginActivity似乎会退出并报告错误。
// If the calling package is null, this generally means that the callee was started
// with a launchMode of singleInstance. Unfortunately, Android does not allow a result
// to be set when the callee is a singleInstance, so we log an error and return.
if (callingPackage == null) {
Log.e(TAG, NULL_CALLING_PKG_ERROR_MSG);
getActivity().finish();
return;
}
答案 1 :(得分:0)
有关如何在Facebook Android SDK上实现某些功能的更改,首先是:
您没有在代码中设置 applicationId ,现在可以通过 AndroidManifest.xml 文件中的元数据标记来完成。
以下是一个例子:
在清单的结束标记之前,您必须设置:
<!-- Facebook Integration -->
<activity
android:name="com.facebook.FacebookActivity"
android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
android:label="@string/app_name"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="@string/facebook_id" />
现在,在onCreate上,您使用新的LoginManager类进行所有不需要UI的登录调用,如下面documentation示例中的示例所示:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FacebookSdk.sdkInitialize(this.getApplicationContext());
callbackManager = CallbackManager.Factory.create();
LoginManager.getInstance().registerCallback(callbackManager,
new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
// App code
}
@Override
public void onCancel() {
// App code
}
@Override
public void onError(FacebookException exception) {
// App code
}
});
}
您随时可以查看新SDK here
的所有更改和文档 <强>更新强>
以下是有关如何使用 Array.AsList();
... logInWithReadPermissions(this, Arrays.asList("public_profile", "email");