0

我创建了我的 android 代码,其中我从 facebook 获取所有数据,然后将其显示在 textView 中,它在我的帐户上运行良好。但是在我尝试连接我的虚拟帐户后,没有获取任何详细信息,我也不知道这个问题的原因。好吧,这是我要查看的代码:

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 个文本视图中显示结果。


编辑
这是我的注销代码:

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 时,你们两个有两种类型的身份验证:

  1. 使用 SDK 身份验证对话框,该对话框将询问用户他的电子邮件/密码。
  2. 使用单点登录 (SSO),该单点登录 (SSO) 仅在设备安装了 facebook 应用程序 (katana) 时才有效。如果是这种情况,该应用程序将负责创建更好的用户体验的身份验证,因为用户已经登录并且不需要重新输入他的凭据。

如果您遵循本教程,那么您正在使用 SSO(如果应用程序已安装),因此,当您使用该facebook.authorize方法时,您要求 fb 应用程序为当前登录用户授权您的应用程序。
如果您希望其他用户使用您的应用程序,您需要该用户退出主 facebook 应用程序。

您可以按照此处的建议使用 sdk 身份验证并绕过 SSO:How to disable Facebook single sign on for android - Facebook-android-sdk,但正如我之前所说,我认为它会导致糟糕的用户体验。

另一件事是您继续使用线程来实现事物,但是 facebook android SDK 已经为此提供了一个帮助程序类,它是AsyncFacebookRunner异步发出 api 请求,请阅读Async API Requests

于 2012-06-26T10:23:46.303 回答