簡體   English   中英

使用Facebook SDK 3的Android應用在簽名后無法登錄

[英]Android app with Facebook SDK 3 doesn't login after sign the app

我在Play商店上有一個應用程序,最近我用新的Facebook 3 SDK對其進行了更新,我想要與Facebook集成所做的一切就是用戶可以將我的應用程序中的單詞/字符串發布到Facebook牆上。 我按照Facebook“入門”和下載的示例中的說明編寫代碼,然后使用Eclipse-> properties-> android-> add library->導入該庫,然后選擇Facebook SDK(如Facebook dev中所述)。 該應用程序可以直接從Eclipse與我自己的銀河S3和S1完美配合,它可以正確登錄並可以毫無問題地貼在我的牆上!

在我照常簽署應用程序並重新發布到Play商店后,問題開始了! 我無法在Facebook上登錄/發布,當然,用戶也無法發布。

嘗試運行已簽名的應用程序時出現此錯誤:

com.facebook.orca.protocol.base.ApiException: remote_app_id does not match stored id

我開始尋找解決方案,所有答案都與“ keyhash”有關。我按此處Stackoverflow (調試+釋放鍵)的說明添加了2個keyhash,並且還獲得了帶有上一個鏈接的答案3中提到的代碼的keyhash, Facebook開發儀表盤中的不同設置..“ app id” / app_id也是正確的,但沒有成功!

當我用eclipse嘗試應用程序時,一切正常,如果應用程序未登錄,則沒有帖子。

這是我的代碼,也許我錯過了一些東西,兩天后我真的很困惑,沒有解決方案

public class main extends Activity {

    private Session.StatusCallback statusCallback = new SessionStatusCallback();

    private static final List<String> PERMISSIONS = Arrays.asList("publish_actions");
    @SuppressWarnings("unused")
    private boolean pendingPublishReauthorization = false;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

              //this code was for test
        try {
            PackageInfo info = getPackageManager().getPackageInfo(
                    "mypackage here", 
                    PackageManager.GET_SIGNATURES);
            for (android.content.pm.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) {

        }

        buttonLoginLogout = (ImageView)findViewById(R.id.buttonLoginLogout);
        post = (ImageButton)findViewById(R.id.fbshare);

        Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS);

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

        updateView();

post.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub
                 publishStory();
            }
        });
}
@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(this, requestCode, resultCode, data);
        }

        @Override
        protected 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()) {
                buttonLoginLogout.setImageResource(R.drawable.fblogout);
                buttonLoginLogout.setOnClickListener(new OnClickListener() {
                    public void onClick(View view) { onClickLogout(); }
                });
                post.setVisibility(View.VISIBLE);
            } else {
                buttonLoginLogout.setImageResource(R.drawable.fblogin);
                buttonLoginLogout.setOnClickListener(new OnClickListener() {
                    public void onClick(View view) { onClickLogin(); }
                });
                post.setVisibility(View.INVISIBLE);
            }
        }

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

        }

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

        }

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

            if (session != null){

                // Check for publish permissions    
                List<String> permissions = session.getPermissions();
                if (!isSubsetOf(PERMISSIONS, permissions)) {
                    pendingPublishReauthorization = true;
                    Session.NewPermissionsRequest newPermissionsRequest = new Session
                            .NewPermissionsRequest(this, PERMISSIONS);
                session.requestNewPublishPermissions(newPermissionsRequest);
                    return;
                }


                Request request = Request.newStatusUpdateRequest(Session.getActiveSession(), messege, new Request.Callback() {
                    public void onCompleted(Response response) {

                        Toast.makeText(main.this, "messege sent..", Toast.LENGTH_SHORT).show();
                    }
                });
                RequestAsyncTask task = new RequestAsyncTask(request);
                task.execute();
            }

        }
        private boolean isSubsetOf(Collection<String> subset, Collection<String>                                             superset) {
            for (String string : subset) {
                if (!superset.contains(string)) {
                    return false;
                }
            }
            return true;
        }
}

請幫助..這是我的第一篇文章,希望找到答案:-)

另一個問題,也許它將解決問題:我必須等待Facebook批准我的應用程序還是沒關系?

謝謝

我遇到了同樣的問題,但是當我通過jarsigner而不是通過eclipse簽名我的應用程序時,它在新的android版本中可以正常工作,但該問題仍然存在於舊的android版本(例如gingerbread)上,並且可能是新SDK中的錯誤。 試試看,讓我知道。

我解決同樣的問題。

我使用Facebook SDK 3.0.2,並且始終remote_app_id與存儲的ID不匹配,出現錯誤。

如果使用正確的密鑰庫進行密鑰哈希,請檢查您的jdk版本。

在jdk 1.7中,出現了此問題。 (我認為)

當我更改JDK 1.6並解決問題時。

嘗試一下,希望它能為您提供幫助。

都謝謝你:-)我的問題是別名:應用程序名稱(別名)有2個單詞..所以簡單的解決方案是在keystore(cmd)命令中別名的前面和結尾添加“”。

暫無
暫無

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

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