我的应用使用AccountManager.getAuthToken().getResult()
获取Google语音的authToken(我知道它是同步和阻止的。我没有写那部分)。通常情况下,Google Play服务会在第一次通知用户需要授权应用访问其帐户时显示通知,之后会缓存该令牌。
用户报告说他从未收到通知,因此,调用getResult()
会导致应用程序崩溃。在做了一些调试,挖掘日志并编写测试应用程序之后,我们缩小了原因,因为用户已经阻止来自Play服务的通知,因为他不想收到有关OTA的通知。显然,由于Play服务无法显示通知,因此该应用无法获得授权,因此,当它调用getResult()
时,它会崩溃。
奇怪的是,它没有抛出异常。在这种情况下,getResult()
会返回一个可以调用以显示授权弹出窗口的意图,就像notifyAuthFailure
设置为false
一样,即使您已将其设置为true
}。此外,它会跳到函数中的最后一个return
,忽略任何其他代码。
这是一些测试代码:
private static Bundle getAccountBundle(Context context, String account) {
Bundle bundle = null;
AccountManager accountManager = AccountManager.get(context);
if (accountManager != null) {
AccountManagerFuture accountManagerFuture = null;
try {
accountManagerFuture = accountManager.getAuthToken(new Account(account, "com.google"), "grandcentral", null, true, null, null);
// This is where the issue starts
bundle = (Bundle) accountManagerFuture.getResult();
return bundle;
} catch (Exception e) {
e.printStackTrace();
}
}
Log.i(TAG, "getAccountBundle: test 1");
return null;
}
在这里,在调用getResult()
之后,bundle
将包含显示授权弹出窗口的意图,但随后它会跳过执行到最后一行,而不会抛出异常。
我可以随时返回bundle
并让调用者检查返回的内容,但为什么会跳到最后?