android - Facebook Android 登录屏幕 WebViewCoreThread 由于未捕获的异常而退出

标签 android facebook authentication oauth nullpointerexception

我正在尝试在我的应用程序中为 Android 实现 Facebook。我在装有 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 版本太旧。如果需要,我可以发布我的代码,但它与在上面的链接中找到的完全相同。任何帮助表示赞赏。谢谢。

这是我的 Activity 课:

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>

最佳答案

Android 2.2 之前的版本在 webkit 代码中有一个错误导致这些空指针异常。参见 http://code.google.com/p/android/issues/detail?id=7900

Facebook SDK 3.0 在 list 中的最低 Android 版本为 2.2 - 可能是因为这个错误?

关于android - Facebook Android 登录屏幕 WebViewCoreThread 由于未捕获的异常而退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16659956/

相关文章:

ruby-on-rails - 如何让未登录的用户只访问受限页面一次?

android - 应用程序 ActionBar 中的后退按钮

android - 如何强制代码转到 Volley JsonObjectRequest 中的 onErrorResponse

java - R.id.ImageButton 的值是多少?

javascript - 如何获取范围内的 Facebook 地点列表

authentication - 使机器学习算法适应我的问题

android - 使android应用程序从rails表中获取数据

ruby - 使用 Facebook 身份验证的 Sinatra session

android - facebook unity sdk获取用户的名字和姓氏:

php - 从 PHP 检索 .htaccess 登录名