我正在使用AccountManager获取OAuth 2.0令牌。
mAccountManager.getAuthToken(mAccount, AUTH_TOKEN_TYPE, true, new AccountManagerCallback<Bundle>() {
@Override
public void run(AccountManagerFuture<Bundle> future) {
Bundle bundle = future.getResult();
if (bundle.containsKey(AccountManager.KEY_AUTHTOKEN)) {
String authToken = future.getResult().getString(AccountManager.KEY_AUTHTOKEN);
... continue
}
}
}
}, null);
如果第一次获得令牌,AccountManager会在状态栏中显示通知,该通知会启动请求访问帐户权限的活动。
问题是,如何在不点击通知的情况下直接显示此活动?
如果有人没有关于此的具体信息,但有用的链接,请发布。
答案 0 :(得分:5)
在这里找到解决方案:
http://www.finalconcept.com.au/article/view/android-account-manager-using-other-accounts
如果页面消失,这里是代码的副本:
private final Handler handler = new Handler();
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
final AccountManager accMgr;
final Account[] accounts;
final Account account;
final AccountManagerFuture<Bundle> amf;
final MainActivity cbt = this;
String authTokenType;
super.onCreate(savedInstanceState);
this.setContentView(R.layout.main);
accMgr = AccountManager.get(this);
authTokenType = "com.google";
accounts = accMgr.getAccountsByType(authTokenType);
account = accounts[2];
amf = accMgr.getAuthToken(account, authTokenType, true,
new AccountManagerCallback<Bundle>() {
@Override
public void run(AccountManagerFuture<Bundle> arg0) {
try {
Bundle result;
Intent i;
String token;
result = arg0.getResult();
if (result.containsKey(AccountManager.KEY_INTENT)) {
i = (Intent)result.get(AccountManager.KEY_INTENT);
if (i.toString().contains("GrantCredentialsPermissionActivity")) {
// Will have to wait for the user to accept
// the request therefore this will have to
// run in a foreground application
cbt.startActivity(i);
} else {
cbt.startActivity(i);
}
} else {
token = (String)result.get(AccountManager.KEY_AUTHTOKEN);
/*
* work with token
*/
// Remember to invalidate the token if the web service rejects it
// if(response.isTokenInvalid()){
// accMgr.invalidateAuthToken(authTokenType, token);
// }
}
} catch (OperationCanceledException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (AuthenticatorException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}, handler);
}
此页面也很有用:
Google Account Authenticator asks for permission at run-time
答案 1 :(得分:0)
通常在大多数情况下从服务中使用通知。如果您想立即展示活动,则无法通过服务进行此操作。但是,当您已经向用户展示您的某个应用活动时,立即显示该活动是没有问题的。在这种情况下不需要通知,所以只需通过&#34; false&#34;作为getAuthToken()的通知参数或在签名中没有该参数的调用方法。如果你想知道,在什么情况下确实显示了活动,下面就是其中之一。
简单地说,当调用AccountManager.getAuthToken()来访问在另一个应用程序(带有另一个签名)中创建的帐户时,会出现此屏幕。要自动显示该视图,只需将活动传递到AccountManager.getAuthToken()或从收到的KEY_INTENT启动它,如user979247的回复中所述。