6

私のアプリケーションはエミュレータで正常に動作しています。そこで、自分のアプリケーションを Android フォンで実行することにしました。アプリケーションを使用して Facebook アカウントにログインしようとしていますが、エミュレーターで正常に動作します。そして、Androidフォンでアプリケーションを実行するとすぐに、常にこの例外が発生します-

01-30 11:06:08.400: E/AndroidRuntime(7463): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=64206, result=0, data=null} to activity {com.facebook.samples.sessionlogin/com.facebook.LoginActivity}: java.lang.NullPointerException

以下は私のコードです-

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment, container, false);

    buttonLoginLogout = (Button) view.findViewById(R.id.buttonLoginLogout);
    textInstructionsOrLink = (TextView) view.findViewById(R.id.instructionsOrLink);

    Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS);

    Session session = Session.getActiveSession();
    if (session == null) {
        if (savedInstanceState != null) {
        session = Session.restoreSession(getActivity(), null, statusCallback,
            savedInstanceState);
        }
        if (session == null) {
        session = new Session(getActivity());
        }
        Session.setActiveSession(session);
        if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) {
        session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback));
        }
    }

    updateView();

    return view;
    }

    @Override
    public void onStart() {
    super.onStart();
    Session.getActiveSession().addCallback(statusCallback);
    }

    @Override
    public void onStop() {
    super.onStop();
    Session.getActiveSession().removeCallback(statusCallback);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Session.getActiveSession().onActivityResult(getActivity(), requestCode, resultCode, data);
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    Session session = Session.getActiveSession();
    Session.saveSession(session, outState);
    }

    private void updateView() {
    Session session = Session.getActiveSession();
    if (session.isOpened()) {

        Intent thesisProject = new Intent(getActivity(), ThesisProjectAndroid.class);
        startActivity(thesisProject);

    } else {
        Log.d(TAG_LOGIN_FAILED,
            "There is something wrong with your Facebook account. Please try again.");

        textInstructionsOrLink.setText(R.string.instructions);
        buttonLoginLogout.setText(R.string.login);
        buttonLoginLogout.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            onClickLogin();
        }
        });
    }
    }


    private void onClickLogin() {
    Session session = Session.getActiveSession();
    if (!session.isOpened() && !session.isClosed()) {
        session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback));
    } else {
        Session.openActiveSession(getActivity(), this, true, statusCallback);
    }
    }

    private void onClickLogout() {
    Session session = Session.getActiveSession();
    if (!session.isClosed()) {
        session.closeAndClearTokenInformation();
    }
    }

    private class SessionStatusCallback implements Session.StatusCallback {
    @Override
    public void call(Session session, SessionState state, Exception exception) {
        updateView();
    }
    }

私がやっていることは-Facebookアカウントを使用してログインするとすぐに、別のインテントに移動する必要があります(エミュレーターで正常に動作しています)が、このアプリケーションをAndroidフォンにインストールするとすぐに、常にLogin failedすぐに取得しますFacebookのログインページでユーザー名とパスワードを入力していなくてもアプリケーションが開始され、上記の例外が発生します。

また、誰かが私のロジックが正しいupdateView methodかどうかを教えてくれますか? 私がやりたかったのは、Facebook 認証が正しく、ログインできることを意味するとすぐに、別のインテントに移動する必要があるということです。

なぜこのようなことが起こっているのか、誰か助けてもらえますか?

4

1 に答える 1

0

@Matt Accolaをタンクに入れます。そのページはこう言います:

Android システム設定で「アクティビティを保持しない」開発者向けオプションがオンになっていると、Facebook SSO ログイン プロセスが壊れます。LoginActivity は繰り返し呼び出され、LoginActivity のインスタンスがリークされるたびに呼び出されます。ログインは実際には完了せず、最終的にプロセスを強制終了する必要があります。

「アクティビティを保持しない」設定がオフになっている場合、このバグは再現できないことに注意してください。

このバグは、すべてのユーザー アカウントがネイティブの Facebook アプリからログアウトされている場合にのみ再現可能であることに注意してください。

再現手順: 1. デバイスの Android 開発者向けオプション ([設定] の下) で [アクティビティを保持しない] 設定を有効にします。

  1. Android 用のネイティブ Facebook アプリがデバイスにインストールされていることを確認します。

  2. すべてのユーザー アカウントがネイティブの Facebook アプリからログアウトされていることを確認します。

  3. Facebook SDK for Android のソース コードとサンプルをダウンロードし、プロジェクトを Eclipse にインポートします。

  4. HelloFacebookSample を起動します。

  5. ログインボタンをタップします。Facebookのログイン画面が表示されるはずです。

  6. Facebook の資格情報を入力し、[ログイン] ボタンをタップします。しばらくすると、認証ダイアログが表示される場合があります。

  7. 認証ダイアログで [OK] をタップします。

予想される動作: ログイン プロセスが完了し、HelloFacebookSample 画面がログイン状態で表示されるはずです。

実際の動作: Facebook 画面は進行状況ダイアログと共に表示されたままです。システム全体の速度が低下し、メモリが不足すると最終的にプロセスがクラッシュし始めます。このプロセス中にヒープ ダンプをキャプチャしたところ、リークされた LoginActivity の多数のインスタンスが表示されます。また、StrictMode を有効にすると、LoginActivity インスタンスがリークされていることを示すメッセージが表示されます。

于 2015-02-27T19:40:15.787 に答える