2

アプリでFacebook認証を使用しようとしていますが、トークンがないためログインできません。LogCatには、「[Tag] System.out [Text] doLogin:」というループがあります。これはFacebookダイアログの前に発生し、表示されたら[OK]をクリックしますが何も起こりません。

これが私のコードです:

private SharedPreferences.Editor loginPrefsEditor;
private Session.StatusCallback statusCallback = new SessionStatusCallback();


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_fb_auth);
    choosePseudoButton = (Button) findViewById(R.id.buttonChoosePseudoFb);
    progressBarFb = (ProgressBar) findViewById(R.id.progressBarFbLoad);
    textViewFbInfo = (TextView) findViewById(R.id.currentInfoFb);
    editTextFbPseudo = (EditText) findViewById(R.id.editTextPseudoFb);
    /*
     * Get existing access_token if any
     */
    mPrefs = getPreferences(MODE_PRIVATE);

    // start Facebook Login
    Session.openActiveSession(this, true, new Session.StatusCallback() {
        public void call(final Session session, SessionState state, Exception exception) {
            if (session.isOpened()) {
                Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {
                    public void onCompleted(GraphUser user, Response response) {
                        if (user != null) {
                            System.out.println("onCreate");  
                            fbToken = session.getAccessToken();
                            SharedPreferences.Editor editor = mPrefs.edit();
                            editor.putString("access_token", fbToken);
                            JSONRequest jr = (JSONRequest) new JSONRequest().execute();

                        }
                    }
                });
            }
            else {
                doLogin();
            }
        }
    });
}

private void doLogin() {
    Session session = Session.getActiveSession();
    if (!session.isOpened() && !session.isClosed()) {
        session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback));
    } else {
        Session.openActiveSession(this, true, statusCallback);
    }
    fbToken = session.getAccessToken();
    System.out.println("doLogin: "+fbToken);
    JSONRequest jr = (JSONRequest) new JSONRequest().execute();
}


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

private void updateView() {
    Session session = Session.getActiveSession();
    if (session.isOpened()) {
        fbToken = session.getAccessToken();
        System.out.println("updateView: "+fbToken);
        JSONRequest jr = (JSONRequest) new JSONRequest().execute();
    } 
    else {
        doLogin();
    }
}

private class SessionStatusCallback implements Session.StatusCallback {
    public void call(Session session, SessionState state, Exception exception) {
        // Respond to session state changes, ex: updating the view
        if( session.isOpened() ){
            Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {

                public void onCompleted(GraphUser user, Response response) {
                }
            });
        }
        updateView();
    }
}
4

1 に答える 1

1

注意すべきいくつかの事柄:

セッションの開始は非同期で行われます。つまり、Session.openActiveSessionを呼び出しても、(常に)すぐにセッションを開くことはありません(別のアクティビティを呼び出したり、ユーザー入力を待つ必要があります)。だからあなたのライン

fbToken = session.getAccessToken();

ほとんどの場合、nullを返します。

次に、セッションがOPENED状態になる前に、セッションが存在する可能性のある状態がいくつかあるため、SessionStatusCallbackで、updateView()呼び出しをif(session.isOpened())チェック内に移動する必要があります。

最後に、onCreateメソッドでSession.openActiveSessionを呼び出し、そのコールバックでは、セッションが開かれていない場合は常にdoLogin()を呼び出します。ただし、前に述べたように、セッションはOPENEDになる前に複数の状態に遷移する可能性があるため、実際にはdoLoginを複数回呼び出しています。そのdoLogin()呼び出しを削除します。

于 2013-03-26T16:50:52.470 に答える