我正在尝试在我的应用中实现Facebook for Android。我正在使用Android 2.0的设备上运行我的应用程序。
我按照https://developers.facebook.com/docs/tutorials/androidsdk/3.0/scrumptious/authenticate/的说明创建了登录屏幕,但我不断遇到错误。
我看到一个登录按钮,我点击它。这将带我进入用户名和密码输入屏幕,我在其中输入我的信息并单击登录。但是一旦我点击登录,我的应用程序崩溃了,我收到以下错误。
ERROR/AndroidRuntime(4607): java.lang.NullPointerException
at android.webkit.SslErrorHandler.handleMessage(SslErrorHandler.java:62)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:622)
at java.lang.Thread.run(Thread.java:1096)
接下来是:
ERROR/ActivityThread(4607): Activity com.facebook.LoginActivity has leaked IntentReceiver android.webkit.BrowserGateReceiver@47b94148 that was originally registered here. Are you missing a call to unregisterReceiver()?
android.app.IntentReceiverLeaked: Activity com.facebook.LoginActivity has leaked IntentReceiver android.webkit.BrowserGateReceiver@47b94148 that was originally registered here. Are you missing a call to unregisterReceiver()?
at android.app.ActivityThread$PackageInfo$ReceiverDispatcher.<init>(ActivityThread.java:797)
at android.app.ActivityThread$PackageInfo.getReceiverDispatcher(ActivityThread.java:608)
at android.app.ApplicationContext.registerReceiverInternal(ApplicationContext.java:813)
at android.app.ApplicationContext.registerReceiver(ApplicationContext.java:800)
at android.app.ApplicationContext.registerReceiver(ApplicationContext.java:794)
at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:308)
at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:308)
at android.webkit.LoadListener.registerReceiver(LoadListener.java:1855)
at android.webkit.LoadListener.<init>(LoadListener.java:191)
at android.webkit.LoadListener.getLoadListener(LoadListener.java:163)
at android.webkit.BrowserFrame.startLoadingResource(BrowserFrame.java:554)
at android.webkit.LoadListener.nativeAddData(Native Method)
at android.webkit.LoadListener.commitLoad(LoadListener.java:1256)
at android.webkit.LoadListener.handleMessage(LoadListener.java:257)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:622)
at java.lang.Thread.run(Thread.java:1096)
我已经搜索了这个问题的答案两天没有成功,我找不到任何东西。我认为问题可能是我手机的Android版本太旧了。如果需要,我可以发布我的代码,但它与上面的链接完全相同。任何帮助表示赞赏。感谢。
这是我的活动课程:
public class FacebookScreen extends FragmentActivity {
private static final int SPLASH = 0;
private static final int SELECTION = 1;
private static final int FRAGMENT_COUNT = SELECTION +1;
private Fragment[] fragments = new Fragment[FRAGMENT_COUNT];
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
uiHelper = new UiLifecycleHelper(this, callback);
uiHelper.onCreate(savedInstanceState);
setContentView(R.layout.facebook_login_screen);
FragmentManager fm = getSupportFragmentManager();
fragments[SPLASH] = fm.findFragmentById(R.id.splashFragment);
fragments[SELECTION] = fm.findFragmentById(R.id.selectionFragment);
FragmentTransaction transaction = fm.beginTransaction();
for(int i = 0; i < fragments.length; i++) {
transaction.hide(fragments[i]);
}
transaction.commit();
}
private void showFragment(int fragmentIndex, boolean addToBackStack) {
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
for (int i = 0; i < fragments.length; i++) {
if (i == fragmentIndex) {
transaction.show(fragments[i]);
} else {
transaction.hide(fragments[i]);
}
}
if (addToBackStack) {
transaction.addToBackStack(null);
}
transaction.commit();
}
private boolean isResumed = false;
@Override
public void onResume() {
super.onResume();
uiHelper.onResume();
isResumed = true;
}
@Override
public void onPause() {
super.onPause();
uiHelper.onPause();
isResumed = false;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
uiHelper.onActivityResult(requestCode, resultCode, data);
}
@Override
public void onDestroy() {
super.onDestroy();
uiHelper.onDestroy();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
uiHelper.onSaveInstanceState(outState);
}
private void onSessionStateChange(Session session, SessionState state, Exception exception) {
// Only make changes if the activity is visible
if (isResumed) {
FragmentManager manager = getSupportFragmentManager();
// Get the number of entries in the back stack
int backStackSize = manager.getBackStackEntryCount();
// Clear the back stack
for (int i = 0; i < backStackSize; i++) {
manager.popBackStack();
}
if (state.isOpened()) {
// If the session state is open:
// Show the authenticated fragment
showFragment(SELECTION, false);
} else if (state.isClosed()) {
// If the session state is closed:
// Show the login fragment
showFragment(SPLASH, false);
}
}
}
@Override
protected void onResumeFragments() {
super.onResumeFragments();
Session session = Session.getActiveSession();
if (session != null && session.isOpened()) {
// if the session is already open,
// try to show the selection fragment
showFragment(SELECTION, false);
} else {
// otherwise present the splash screen
// and ask the person to login.
showFragment(SPLASH, false);
}
}
private UiLifecycleHelper uiHelper;
private Session.StatusCallback callback = new Session.StatusCallback() {
@Override
public void call(Session session, SessionState state, Exception exception) {
onSessionStateChange(session, state, exception);
}
};
}
这是我的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<fragment android:name="com.example.SelectionFragment"
android:id="@+id/selectionFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<fragment android:name="com.example.SplashFragment"
android:id="@+id/splashFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
答案 0 :(得分:2)
2.2之前的Android版本在webkit代码中有一个错误导致这些空指针异常。见http://code.google.com/p/android/issues/detail?id=7900
Facebook SDK 3.0在清单中的最低Android版本为2.2 - 也许是因为这个错误?
答案 1 :(得分:0)
您需要发布代码示例。它抛出NULLPointerException,这可能是Intent泄漏的原因。如果你分享一个片段,我们至少可以知道哪里出错了