0

Facebook からすべてのデータを取得し、それを textView に表示する Android コードを作成しました。これは自分のアカウントで問題なく動作します。しかし、ダミーアカウントに接続しようとした後、詳細が取得されず、この問題の原因がわかりません. さて、レビューする私のコードは次のとおりです。

private void getFbName() {
    mProgress.setMessage("Finalizing ...");
    mProgress.show();

    new Thread() {
        @Override
        public void run() {
            String name = "";
            int what = 1;

            try {
                String me = mFacebook.request("me");

                JSONObject jsonObj = (JSONObject) new JSONTokener(me).nextValue();
                name = jsonObj.getString("first_name") + "|" + jsonObj.getString("last_name") + "|" + jsonObj.getString("email") + "|" + jsonObj.getString("id");
                what = 0;
            }
            catch (Exception ex) {
                ex.printStackTrace();
            }

            mFbHandler.sendMessage(mFbHandler.obtainMessage(what, name));
        }
    }.start();
}

private Handler mFbHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        mProgress.dismiss();

        if (msg.what == 0) {
            String username = (String) msg.obj;
            username = (username.equals("")) ? "No Name" : username;

            //SPLITTER
            String tokens[] = username.split("\\|");
            TextView fname = (TextView) findViewById(R.id.textView1);
            fname.setText(tokens[0]);

            TextView lname = (TextView) findViewById(R.id.textView2);
            lname.setText(tokens[1]);

            TextView eadd = (TextView) findViewById(R.id.textView3);
            eadd.setText(tokens[2]);

            TextView fbid = (TextView) findViewById(R.id.textView4);
            fbid.setText(tokens[3]);

            SessionStore.saveName(username, Main.this);
            //mFacebookBtn.setText("       Facebook (" + username + ")");

            Toast.makeText(Main.this, "Connected to Facebook as " + username, Toast.LENGTH_SHORT).show();
        }
        else {
            Toast.makeText(Main.this, "Connected to Facebook", Toast.LENGTH_SHORT).show();
        }
    }
};

さて、私はコードのこのチュートリアルに従って、デザインにいくつかの変更を加えて、ログイン用に 1 つのボタンを使用し、ログアウト用に別のボタンを使用して、結果を 4 つの textViews に表示しました。


編集
これが私のログアウトコードです:

private void fbLogout() {
    mProgress.setMessage("Disconnecting from Facebook");
    mProgress.show();

    new Thread() {
        @Override public void run() {
            SessionStore.clear(Main.this);
            int what = 1;
            try {
                mFacebook.logout(Main.this);
                what = 0;
            }
            catch (Exception ex) {
                ex.printStackTrace();
            }

            mHandler.sendMessage(mHandler.obtainMessage(what));
        }
    }.start(); 
}
4

1 に答える 1

1

facebook android SDK を使用する場合、2 種類の認証があります。

  1. ユーザーに電子メール/パスワードを要求する SDK 認証ダイアログを使用します。
  2. デバイスに facebook アプリケーション (katana) がインストールされている場合にのみ機能するシングル サインオン (SSO) を使用します。その場合、そのアプリは認証を担当し、ユーザーは既にサインインしており、資格情報を再入力する必要がないため、ユーザー エクスペリエンスが向上します。

チュートリアルに従っている場合は、SSO を使用しています (もちろんアプリがインストールされている場合)。そのため、このfacebook.authorize方法を使用しているときは常に、現在ログインしているユーザーに対してアプリを承認するよう fb アプリに要求しています。
別のユーザーにあなたのアプリを使用させたい場合は、ユーザーがメインの facebook アプリからログアウトする必要があります。

ここで提案されているように、sdk 認証を使用して SSO をバイパスできます: How to disable Facebook single sign on for android - Facebook-android-sdkですが、前に述べたように、ユーザー エクスペリエンスが低下すると思います。

もう 1 つのことは、スレッドを使用して物事を実装し続けることですが、facebook android SDK は既にそのためのヘルパー クラスを提供しています。API リクエストを非同期的に作成するのはAsyncFacebookRunnerです。 Async API Requestsを参照してください。

于 2012-06-26T10:23:46.303 に答える