簡體   English   中英

登錄后,Facebook Android SDK無法打開會話

[英]Facebook Android SDK does not open Session after login

1)這個問題出現了很多次,並且出現問題的人總是“您有錯誤的密鑰哈希”。

2)Facebook文檔告訴我們使用此代碼來獲取我們的密鑰哈希:

keytool -exportcert -alias MyKeyAlias -keystore path\to\my\Key | openssl sha1 -binary | openssl base64

3)好吧,這給了我那個鑰匙:1yl ********** Q3A

當我嘗試登錄時,收到以下消息:com.facebook.http.protocol.ApiException:(#404)密鑰哈希XHA ********** q10與任何存儲的密鑰哈希都不匹配。

4)然后,我將XHA ********** q10復制並粘貼到我的應用程序設置中,這也不是我的密鑰。

5)因此,我閱讀了文檔,該文檔是為您提供正確的密鑰哈希的代碼。 這段代碼:

// Add code to print out the key hash
try {
    PackageInfo info = getPackageManager().getPackageInfo(
            "com.facebook.samples.hellofacebook", 
            PackageManager.GET_SIGNATURES);
    for (Signature signature : info.signatures) {
        MessageDigest md = MessageDigest.getInstance("SHA");
        md.update(signature.toByteArray());
        Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
        }
} catch (NameNotFoundException e) {

} catch (NoSuchAlgorithmException e) {

}

有效! 給我這個哈希值:+ HA ********** q0 =

6)我將最后一個哈希值放在應用程序設置上,是,現在我可以連接了! 但是,現在我無法打開會話!!!

我正在使用以下代碼:

public class FBActivity extends Activity {

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_view);

        System.out.println("Start Facebook login");
        Session.openActiveSession(this, true, new Session.StatusCallback() {
            public void call(Session session, SessionState state, 
                                              Exception exception) {
                System.out.println("Call");
                if (session.isOpened()) {
                    System.out.println("Open");
                    Request.newMeRequest(session, new Request.GraphUserCallback() {
                        public void onCompleted(GraphUser user, Response response) {
                            System.out.println("Complete");
                            if (user != null) {
                                System.out.println(user.getName());

                            } else {
                                System.out.println("User NULL");
                            }
                        }
                    }).executeAsync();
                } else {
                System.out.println("Not open");
            }

        });
    }
}

日志是:

“開始Facebook登錄

呼叫

沒開

呼叫

沒開”

我不知道還能做什么,因為我已經有了正確的密鑰哈希並且可以進行登錄了。

我想到了:

缺少以下方法。 剛添加它,一切正常。

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

正在反復撥打電話(通過單擊相同的登錄按鈕)。 如果是,則第一次打開Facebook對話框后(第一次單擊登錄bttn將打開fbk對話框,但此后不會打開)原因:因為創建了會話且未清除會話,即未在幫助下注銷人您可以在此會話中獲取fbk用戶的個人資料信息。

如果您想這樣做,也可以編寫以下代碼行:

 Session session = Session.getActiveSession();
             if (session != null && session.isOpened()) {

             Toast.makeText(getApplicationContext(), "session is opened",
             Toast.LENGTH_LONG).show();

             /* clear session and again click will show facebook login */

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

             }

清除令牌后,立即進行登錄通話

FacebookAuthentication();


    private void FacebookAuthentication() {

        // Toast.makeText(getApplicationContext(),
        // "new session was created and requires login", Toast.LENGTH_LONG)
        // .show();

        Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS);

        OpenRequest op = new Session.OpenRequest(SignUpActivity.this);

        op.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO);
        op.setCallback(statusCallback);

        op.setPermissions(Arrays.asList("email", "public_profile"));

        Session session = new Session.Builder(getApplicationContext()).build();

        Session.setActiveSession(session);

        session.openForRead(op);

    }

全球宣告

private Session.StatusCallback statusCallback = new SessionStatusCallback();.

//無法訪問私人電子郵件

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

            if (session.isOpened()) {

                makeFacebookMeRequest(session);

            }

        }
    }

public void makeFacebookMeRequest(final Session session) {

        Request.newMeRequest(session, new Request.GraphUserCallback() {

            @Override
            public void onCompleted(GraphUser user, Response response) {

                if (user != null) {

                    String access_token = session.getAccessToken();

                    Log.d("Response", "Response=" + response);
                    Log.d("AccessToken", access_token);

                    UserId_FromFacebook = user.getId();
                    UserName_FromFacebook = user.getUsername();
                    FirstName_FromFacebook = user.getFirstName();
                    LastName_FromFacebook = user.getLastName();

                    try {

                        Email_FromFacebook = user.asMap().get("email")
                                .toString();

                        // Toast.makeText(getApplicationContext(),
                        // "" + Email_FromFacebook, Toast.LENGTH_LONG)
                        // .show();

                    } catch (Exception e) {

                        // e.printStackTrace();

                    }

                }

                //You can move to your activiy here and make sure user is signed up using your api

            }

        }).executeAsync();
    }

////////////////在您的代碼中應用此補丁:只需在下面的方法中取消我的代碼的注釋即可)//////////////////////

private void LoginAndFetchFacebookProfileInfo() {

        Session currentSession = Session.getActiveSession();

        if (currentSession == null || currentSession.getState().isClosed()) {



            Session session = new Session(getApplicationContext());
            Session.setActiveSession(session);

            currentSession = session;

        }

        if (currentSession.isOpened()) {

//you are logged in so do whatever you want
            // Toast.makeText(SignUpActivity.this, "session is  opened",
            // Toast.LENGTH_LONG).show();

            makeFacebookMeRequest(currentSession);

            // Session session = Session.getActiveSession();
            // if (session != null && session.isOpened()) {
            //
            // Toast.makeText(getApplicationContext(), "session is opened",
            // Toast.LENGTH_LONG).show();
            //
            // /* clear session and again click will show facebook login */
            //
            // session = Session.getActiveSession();
            // if (!session.isClosed()) {
            // session.closeAndClearTokenInformation();
            // }
            //
            // }
            //
            // FacebookAuthentication();

        } else if (!currentSession.isOpened()) {
            // Ask for username and password
            // Toast.makeText(SignUpActivity.this, "session is not opened",
            // Toast.LENGTH_LONG).show();

            FacebookAuthentication();
        }

    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM