装有 Facebook SDK 3 的 Android 应用在签署应用后无法登录



我在play store上有一个应用程序,最近我用新的Facebook 3 SDK更新了它,我想做的所有与Facebook集成的事情是,用户可以将我的应用程序中的单词/字符串发布到Facebook墙上。我按照Facebook"入门"和我下载的示例中的说明编写代码,我使用Eclipse->properties->android->addlibrary->导入库,然后选择FacebookSDK(如Facebookdev中所述(。该应用程序与我自己的galaxy S3&S1直接来自eclipse,它正确登录并张贴在我的墙上,没有任何问题!

在我像往常一样签署了应用程序并在play store上重新发布后,问题就开始了!我不能登录/在Facebook上发帖,当然,用户也不能发帖。

我在尝试运行签名应用程序时遇到了这个错误:

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

我开始寻找解决方案,所有的答案都是关于"keyhash"的。。我添加了2个keyhashes,如这里所解释的Stackloverflow(调试+释放密钥(。。并且还得到了一个keyhash,代码如前一个链接中答案3所述,在Facebook开发面板中尝试了不同的设置。。"app_id"/app_id也是正确的,但没有成功!!

当我尝试使用eclipse的应用程序时,一切正常,如果应用程序没有登录,就没有帖子

这是我的代码,也许我错过了什么,我真的很困惑2天后没有解决

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;
        }
}

请帮忙。。这是我的第一篇帖子,我希望能找到答案:-(

另一个问题,也许它会解决问题:我必须等待脸书批准我的应用程序还是无关紧要

感谢

我也遇到了同样的问题,但当我用jarsigner而不是eclipse签署我的应用程序时,它在新的android版本中运行良好,但这个问题在姜饼等旧的android版本上仍然存在,它可能是新SDK中的一个错误。试试看,让我知道。

我解决了同样的问题。

我使用facebooksdk 3.0.2,并且总是remoteapp_id与存储的id不匹配。错误出现。

如果您使用正确的密钥库进行密钥散列,请检查您的jdk版本。

在jdk1.7中,出现了这个问题。(我认为(

当我更改jdk 1.6时,问题解决了。

试试看,希望它能帮助你。

感谢你们:-(我的问题是别名:应用程序名称(别名(有两个单词。。因此,简单的解决方案是在keystore(cmd(命令中的别名之前和末尾添加"。

相关内容

  • 没有找到相关文章

最新更新