如何通过Android的客户经理类检索Twitter和Facebook的身份验证和令牌 [英] How to retrieve Twitter and facebook Authentication and Token through Android's Account Manager classes

查看:168
本文介绍了如何通过Android的客户经理类检索Twitter和Facebook的身份验证和令牌的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想通过检索客户经理班令牌。下面是示例code,它适用于微博,但没有为Facebook plz帮助我。

 公共类AccountManagerActivity延伸活动{

    的AccountManager mAccountManager;
    AccountManagerFuture<包> C;
    字符串标记;


    / **第一次创建活动时调用。 * /
    @覆盖
    公共无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.main);

        mAccountManager = AccountManager.get(本);
        帐户[] ACC = mAccountManager.getAccounts();
        的for(int i = 1; I< acc.length;我++){
            的System.out.println(帐号名称==+ ACC [我]。名称);
            的System.out.println(帐户类型==+ ACC [I] .TYPE);
        }
        AuthenticatorDescription []广告= mAccountManager.getAuthenticatorTypes();
        的for(int i = 1; I< ad.length;我++){
            的System.out.println(AuthenticatorDescription ==+广告[I] .TYPE);
        }


        tokenForTwitter();
        tokenForFacebook();
    }

    私人无效tokenForFacebook(){
        帐户[] accts = mAccountManager
                .getAccountsByType(com.facebook.auth.login);
        INT I = 0;
        如果(accts.length大于0){
            的System.out.println(在这里);
            帐户的acct = accts [0];
            C = mAccountManager.getAuthToken(会计,
                    com.facebook.auth.token,空,
                    对此,新AccountManagerCallback<包>(){

                        @覆盖
                        公共无效的run(AccountManagerFuture<包>为arg0){
                            尝试 {
                                叠B = arg0.getResult();
                                的System.out.println(Facebook本AUHTOKEN:
                                        + b.getString(AccountManager.KEY_AUTHTOKEN));
                                意向推出=(意向)乙
                                        获得(AccountManager.KEY_INTENT);
                                如果(推出!= NULL){
                                    startActivityForResult(发射,0);
                                    返回;
                                }
                            }赶上(例外五){
                                的System.out.println(异常@的authToken);
                            }
                        }
                    }, 空值);

            C = mAccountManager.getAuthToken(会计,
                    com.facebook.auth.token.secret/ *
                                                             *发生的事情在这里
                                                             * /,空,这一点,
                    新AccountManagerCallback<包>(){

                        @覆盖
                        公共无效的run(AccountManagerFuture<包>为arg0){
                            尝试 {
                                叠B = arg0.getResult();
                                的System.out.println(Facebook本AUHTOKEN:
                                        + b.getString(AccountManager.KEY_AUTHTOKEN));
                                意向推出=(意向)乙
                                        获得(AccountManager.KEY_INTENT);
                                如果(推出!= NULL){
                                    startActivityForResult(发射,0);
                                    返回;
                                }
                            }赶上(例外五){
                                的System.out.println(异常@的authToken);
                            }
                        }
                    }, 空值);

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

            我++;
        }

    }

    公共无效tokenForTwitter(){
        帐户[] accts = mAccountManager
                .getAccountsByType(com.twitter.android.auth.login);
        INT I = 0;
        如果(accts.length大于0){
            的System.out.println(在这里);
            帐户的acct = accts [0];
            C = mAccountManager.getAuthToken(会计,
                    com.twitter.android.oauth.token/ *发生的事情在这里* /,空,
                    对此,新AccountManagerCallback<包>(){

                        @覆盖
                        公共无效的run(AccountManagerFuture<包>为arg0){
                            尝试 {
                                叠B = arg0.getResult();
                                的System.out.println(推特本AUHTOKEN:
                                        + b.getString(AccountManager.KEY_AUTHTOKEN));
                                意向推出=(意向)乙
                                        获得(AccountManager.KEY_INTENT);
                                如果(推出!= NULL){
                                    startActivityForResult(发射,0);
                                    返回;
                                }
                            }赶上(例外五){
                                的System.out.println(异常@的authToken);
                            }
                        }
                    }, 空值);

            C = mAccountManager.getAuthToken(会计,
                    com.twitter.android.oauth.token.secret/ *
                                                             *发生的事情在这里
                                                             * /,空,这一点,
                    新AccountManagerCallback<包>(){

                        @覆盖
                        公共无效的run(AccountManagerFuture<包>为arg0){
                            尝试 {
                                叠B = arg0.getResult();
                                的System.out.println(推特本AUHTOKEN:
                                        + b.getString(AccountManager.KEY_AUTHTOKEN));
                                意向推出=(意向)乙
                                        获得(AccountManager.KEY_INTENT);
                                如果(推出!= NULL){
                                    startActivityForResult(发射,0);
                                    返回;
                                }
                            }赶上(例外五){
                                的System.out.println(异常@的authToken);
                            }
                        }
                    }, 空值);

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

            我++;
        }

    }

}
 

解决方案

呼叫 AccountManager.getAccountsByType(空)来检索所有帐户,并检查返回的帐户数据包括信息需要。它可能根本就没有被暴露出来。

尝试调用 AccountManager.blockingGetAuthToken 代替。此外,请确保您的清单中有 USE_CREDENTIALS 权限设置正确。

您可以看到这个讨论<一个href="http://stackoverflow.com/questions/4593061/how-to-retrieve-an-facebook-authtoken-from-the-accounts-saved-on-android">How从保存在Android上的帐户检索的Facebook-的authToken

不过,我也建议的Facebook SDK 离线访问权限(此权限使得通过OAuth的端点长寿返回的访问令牌,否则身份验证令牌仅对1小时。)

I want to retrieve token via Account Manager classes. Here is sample code that works for twitter but not for facebook plz help me.

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

    }

}

解决方案

Call AccountManager.getAccountsByType(null) to retrieve all accounts, and check the returned account data includes the information you need. It may simply not be exposed.

Try calling AccountManager.blockingGetAuthToken instead. Also, make sure your manifest has the USE_CREDENTIALS permission set correctly.

You can see this discussion How to retrieve an Facebook-AuthToken from the accounts saved on Android

But I would also suggest Facebook SDK with offline access permission(This permission makes the access token returned by the OAuth endpoint long-lived, otherwise auth token is valid only for 1 hour.)

这篇关于如何通过Android的客户经理类检索Twitter和Facebook的身份验证和令牌的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆