问题 如何通过Android的Account Manager类检索Twitter和Facebook身份验证和令牌


我想通过Account Manager类检索令牌。这是适用于Twitter的示例代码,但不适用于facebook plz帮助我。

public class AccountManagerActivity extends Activity {

    AccountManager mAccountManager;
    AccountManagerFuture<Bundle> c;
    String token;


    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mAccountManager = AccountManager.get(this);
        Account[] acc = mAccountManager.getAccounts();
        for (int i = 1; i < acc.length; i++) {
            System.out.println("Account name==" + acc[i].name);
            System.out.println("Account Type==" + acc[i].type);
        }
        AuthenticatorDescription[] ad = mAccountManager.getAuthenticatorTypes();
        for (int i = 1; i < ad.length; i++) {
            System.out.println("AuthenticatorDescription==" + ad[i].type);
        }


        tokenForTwitter();
        tokenForFacebook();
    }

    private void tokenForFacebook() {
        Account[] accts = mAccountManager
                .getAccountsByType("com.facebook.auth.login");
        int i = 0;
        if (accts.length > 0) {
            System.out.println("here");
            Account acct = accts[0];
            c = mAccountManager.getAuthToken(acct,
                    "com.facebook.auth.token" , null,
                    this, new AccountManagerCallback<Bundle>() {

                        @Override
                        public void run(AccountManagerFuture<Bundle> arg0) {
                            try {
                                Bundle b = arg0.getResult();
                                System.out.println("Facebook THIS AUHTOKEN: "
                                        + b.getString(AccountManager.KEY_AUTHTOKEN));
                                Intent launch = (Intent) b
                                        .get(AccountManager.KEY_INTENT);
                                if (launch != null) {
                                    startActivityForResult(launch, 0);
                                    return;
                                }
                            } catch (Exception e) {
                                System.out.println("EXCEPTION@AUTHTOKEN");
                            }
                        }
                    }, null);

            c = mAccountManager.getAuthToken(acct,
                    "com.facebook.auth.token.secret" /*
                                                             * what goes here
                                                             */, null, this,
                    new AccountManagerCallback<Bundle>() {

                        @Override
                        public void run(AccountManagerFuture<Bundle> arg0) {
                            try {
                                Bundle b = arg0.getResult();
                                System.out.println("Facebook THIS AUHTOKEN: "
                                        + b.getString(AccountManager.KEY_AUTHTOKEN));
                                Intent launch = (Intent) b
                                        .get(AccountManager.KEY_INTENT);
                                if (launch != null) {
                                    startActivityForResult(launch, 0);
                                    return;
                                }
                            } catch (Exception e) {
                                System.out.println("EXCEPTION@AUTHTOKEN");
                            }
                        }
                    }, null);

            // mHandler.sendMessageDelayed(mHandler.obtainMessage(CALL), 0);

            i++;
        }

    }

    public void tokenForTwitter() {
        Account[] accts = mAccountManager
                .getAccountsByType("com.twitter.android.auth.login");
        int i = 0;
        if (accts.length > 0) {
            System.out.println("here");
            Account acct = accts[0];
            c = mAccountManager.getAuthToken(acct,
                    "com.twitter.android.oauth.token" /* what goes here */, null,
                    this, new AccountManagerCallback<Bundle>() {

                        @Override
                        public void run(AccountManagerFuture<Bundle> arg0) {
                            try {
                                Bundle b = arg0.getResult();
                                System.out.println("twitter THIS AUHTOKEN: "
                                        + b.getString(AccountManager.KEY_AUTHTOKEN));
                                Intent launch = (Intent) b
                                        .get(AccountManager.KEY_INTENT);
                                if (launch != null) {
                                    startActivityForResult(launch, 0);
                                    return;
                                }
                            } catch (Exception e) {
                                System.out.println("EXCEPTION@AUTHTOKEN");
                            }
                        }
                    }, null);

            c = mAccountManager.getAuthToken(acct,
                    "com.twitter.android.oauth.token.secret" /*
                                                             * what goes here
                                                             */, null, this,
                    new AccountManagerCallback<Bundle>() {

                        @Override
                        public void run(AccountManagerFuture<Bundle> arg0) {
                            try {
                                Bundle b = arg0.getResult();
                                System.out.println("twitter THIS AUHTOKEN: "
                                        + b.getString(AccountManager.KEY_AUTHTOKEN));
                                Intent launch = (Intent) b
                                        .get(AccountManager.KEY_INTENT);
                                if (launch != null) {
                                    startActivityForResult(launch, 0);
                                    return;
                                }
                            } catch (Exception e) {
                                System.out.println("EXCEPTION@AUTHTOKEN");
                            }
                        }
                    }, null);

            // mHandler.sendMessageDelayed(mHandler.obtainMessage(CALL), 0);

            i++;
        }

    }

}

9098
2018-03-12 14:02


起源

-1两个问题合二为一......对于Facebook来说,它是一个副本 stackoverflow.com/questions/4593061/... - rds


答案:


呼叫 AccountManager.getAccountsByType(null) 检索所有帐户,并检查返回的帐户数据包括您需要的信息。它可能根本不会暴露。

试着打电话 AccountManager.blockingGetAuthToken 代替。另外,请确保您的清单具有 USE_CREDENTIALS 权限设置正确。

你可以看到这个讨论 如何从Android上保存的帐户中检索Facebook-AuthToken

但我也建议 Facebook SDK 具有脱机访问权限(此权限使OAuth端点返回的访问令牌长期存在,否则验证令牌仅在1小时内有效。)


8
2018-03-21 06:23



它现在总是在Android M上返回0结果 - Dpedrinha


您还可以创建意图并从Facebook应用程序获取令牌

Intent intent = new Intent();
intent.setClassName("com.facebook.katana", "com.facebook.katana.ProxyAuth");
intent.putExtra("client_id", apiKey);
intent.putExtra("scope", scope);

try {
    activity.startActivityForResult(intent, requestCode);
} catch (ActivityNotFoundException e) {
    return false;
}

然后 onActivityResult(int requestCode, int resultCode, Intent data) 你的活动,你可以使用令牌

data.getStringExtra("access_token");

2
2017-08-15 02:56





仅供参考,getAuthToken的facebook应用程序部分未实现。反编译时,您会看到它只返回null。

您应该使用Facebook SDK。


0
2017-10-06 17:28



它不是真正的@antonee marthin