如何从Android上保存的帐户中检索Facebook AuthToken
我正试图使用以下代码检索Facebook的AuthToken(由Android版Facebook保存)如何从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;
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标记。这就是我的意思,不确定是否实际发生了这种情况。