1

Play ストアにアプリがあります。最近、新しい Facebook 3 SDK で更新しました。Facebook 統合でやりたいことは、ユーザーがアプリから Facebook ウォールに単語/文字列を投稿できるようにすることだけです。Facebookの「はじめに」とダウンロードしたサンプルで説明されているようにコードを記述し、ライブラリをEclipse->プロパティ-> Android->ライブラリの追加->でインポートし、Facebook SDKを選択します(Facebook devで述べたように)。このアプリは、Eclipse から直接自分の Galaxy S3 と S1 でうまく動作し、正しくサインインして問題なくウォールに投稿します。

いつものようにアプリに署名し、プレイストアで再公開した後、問題が発生しました! Facebook にログイン/投稿できません。もちろん、ユーザーも投稿できません。

署名済みアプリを実行しようとすると、次のエラーが発生しました。

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

私は解決策を探し始めました、すべての答えは「キーハッシュ」に関するものでした..ここで説明されているように2つのキーハッシュを追加しましたStackoverflow(デバッグ+リリースキー)..また、前のリンクの回答3に記載されているコードを含むキーハッシュを取得し、試しましたFacebook dev ダッシュボードの異なる設定.. "app id"/app_id も正しいですが、成功しません !!

eclipse all OK でアプリを試してみると、アプリがログインしていない場合、投稿はありません。

ここに私のコードがあります、多分私は何かを逃しました、私は解決策なしで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;
        }
}

助けてください..これは私の最初の投稿です。答えが見つかることを願っています:-)

別の問題、多分それは問題を解決するでしょう: Facebook が私のアプリを承認するのを待たなければなりませんか、それとも問題ではありませんか?

ありがとう

4

3 に答える 3

0

ありがとうございます:-)私の問題はエイリアス名でした:アプリ名(エイリアス)は2語でした..簡単な解決策は、キーストア(cmd)コマンドでエイリアスの前と最後に「」を追加することでした。

于 2013-11-14T13:26:36.060 に答える
0

私は同じ問題に直面しましたが、eclipse ではなく jarsigner でアプリケーションに署名すると、新しい Android バージョンでは問題なく動作しますが、ジンジャーブレッドのような古い Android バージョンにはまだ問題があり、新しい SDK のバグである可能性があります。それを試して、私に知らせてください。

于 2013-05-10T11:25:51.677 に答える
0

私は同じ問題を解決します。

私はfacebook sdk 3.0.2を使用していますが、常にremote_app_idが保存されたIDと一致しないというエラーが発生します。

正しいキーストアでキーハッシュを作成する場合は、jdk のバージョンを確認してください。

jdk 1.7 では、この問題が発生します。(おもう)

jdk 1.6を変更すると問題が解決しました。

それを試してみて、それがあなたを助けることを願っています.

于 2013-08-12T06:09:10.180 に答える