Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Android上保存的帐户中检索Facebook AuthToken_Android_Facebook_Accountmanager_Auth Token - Fatal编程技术网

如何从Android上保存的帐户中检索Facebook AuthToken

如何从Android上保存的帐户中检索Facebook AuthToken,android,facebook,accountmanager,auth-token,Android,Facebook,Accountmanager,Auth Token,我正试图使用以下代码检索Facebook的AuthToken(由Android版Facebook保存) AccountManager am = AccountManager.get(this); Account[] accounts = am.getAccountsByType("com.facebook.auth.login"); if (accounts.length > 0) { for(int j = 0; j < accounts.length;

我正试图使用以下代码检索Facebook的AuthToken(由Android版Facebook保存)

AccountManager am = AccountManager.get(this);
Account[] accounts = am.getAccountsByType("com.facebook.auth.login");
if (accounts.length > 0) {          
    for(int j = 0; j < accounts.length; j++) {
        Account account = accounts[j];
        if(account.type != null && account.type.equals("com.facebook.auth.login")) { 
            Log.e(RuntimeVars.MY_NAME, "FACEBOOK-TYPE FOUND");
            am.getAuthToken(account, "com.facebook.auth.login", null, ConversationList.this,
                new AccountManagerCallback<Bundle>() {
                    public void run(AccountManagerFuture<Bundle> arg0) {
                        try {
                            Bundle b = arg0.getResult();
                            Log.e(RuntimeVars.MY_NAME, "THIS AUTHTOKEN: " + b.getString(AccountManager.KEY_AUTHTOKEN));
                        }
                        catch (Exception e) {
                            Log.e(RuntimeVars.MY_NAME, "EXCEPTION@AUTHTOKEN");
                        }
                    }
                }, null);
            }
        }
    }
AccountManager am=AccountManager.get(这个);
Account[]accounts=am.getAccountsByType(“com.facebook.auth.login”);
如果(accounts.length>0){
对于(int j=0;j
找到登录凭据并将找到的FACEBOOK-TYPE写入LogCat,但此AUTHTOKEN:[…]和EXCEPTION@AUTHTOKEN已记录。因此,我假设从未调用过
am.getAuthToken

我错过了什么

一般来说,如果有更好的(至少是有效的)方法从Android帐户检索Facebook authtoken,请告诉我

非常感谢你的帮助

致以最诚挚的问候

S.

在am.getAuthToken之前添加try{before am.getAuthToken,并在该方法声明结束时捕获异常。这将告诉您发生异常的原因和位置

尝试调用
AccountManager.blockingGetAuthToken
。如果这样做有效,那么这里有更有趣的错误


另外,请确保您的清单正确设置了
使用\u凭据
权限。

为什么不使用Facebook SDK


其中的
Facebook
类有一个成员来获取OAuth 2.0访问令牌(如果您需要的话),
getAccessToken()

要解释您的日志记录语句都没有被访问的事实,请考虑:

第8行:

        am.getAuthToken(account, "com.facebook.auth.login", null, ConversationList.this,
…可以返回立即可用的令牌。也许这就是您要寻找的答案?引用AccountManager文档:

如果以前生成的身份验证令牌 已为此帐户和类型缓存, 然后返回。否则,如果 保存的密码可用,它是 发送到服务器以生成新的 身份验证令牌。否则,用户为 提示输入密码


没有引发异常。如果我将此am.getAuthToken放入一个try中,则所有内容都会运行。未捕获任何内容。返回null。您有关于authTokenTypes的任何信息吗?我只假设facebook类型的名称为“com.facebook.auth.login”,但我无法验证。这是要确认的第一件事。我会尝试调用
AccountManager.getAccountsByType(null)
检索所有帐户,并从中改进代码。希望返回的帐户数据包含您需要的信息。它可能不会公开。显然,对于Google auth,authTokenTypes字符串应该是“啊”.不知道人们是如何确定的,但对于Facebook,我猜这是类似的武断,不幸的是。事实上,我知道Google的AccountType是“com.Google”,TokenType是“啊”,对吧。Facebook的AccountType肯定是“com.Facebook.auth.login”,但Facebook的TokenType没有可用信息。我也找不到如何检索所有可用TokenType的线索:(@dave如果您使用facebook SDK,canAFAIK用户需要输入他们的facebook凭据,请尝试帮助sota。但这些凭据应该已经通过帐户提供商提供了,我想……应该可以,但可能会受到限制,以防止安卓应用程序在未经明确许可的情况下访问用户数据。我肯定会建议st使用此解决方案(必要时提示输入密码),然后在以后找到使用AccountsManager.AFAIK的方法时进行替换-Facebook Android SDK返回一个仅在1小时内有效的身份验证令牌。这意味着用户需要在每次访问其FB帐户时使用其SDK OAUth界面重新登录。如果您需要一个长期有效的令牌,则应请求脱机\u ac访问权限。此权限使OAuth终结点返回的访问令牌长期有效。有关详细信息,请参阅。@Olle脱机访问权限现在已被弃用。但我必须说,我真的不明白为什么这应该解释什么都没有发生。:-s在我看来,也没有生成新的身份验证令牌,我也没有询问密码…如果我理解正确,没有发生任何事情,因为您没有保存getAuthToken的结果。我建议的解释意味着您必须执行以下操作:
AccountManagerFuture amf=am.getAuthToken(帐户,“com.facebook.auth.login”,null,ConversationList.this,…)
在本例中,当前您正在丢弃返回值“amf”。相反,请存储它,如果它不为null,则从中检索auth标记。这就是我的意思,不确定是否实际发生了这种情况。