未调用 AbstractAccountAuthenticator getAuthToken
AbstractAccountAuthenticator getAuthToken not being called
我正在使用 AbstractAccountAuthenticator 的自定义实现,并且我已经按照文档实现了 getAuthToken。我一直在关注本教程:http://blog.udinic.com/2013/04/24/write-your-own-android-authenticator/
但是,我不了解何时调用 AbstractAccountAuthenticator 实现中的 getAuthToken 方法。我已经在清单中使用我创建的实现它的服务进行了设置,创建了登录页面并可以添加帐户,添加令牌并使用 AccountManager class 从我的活动代码中获取令牌,但在任何文档解释了何时调用 AbstractAccountAuthenticator 代码。
有人能帮我理解为什么我必须实施 autheniticator,但它似乎没有被使用。
那是因为你的应用程序和你的认证器之间有一个中介,它是Android的AccountManager
class.
您的身份验证器实际上是与其关联的帐户类型的 "plugin";它不仅可以供您的应用程序使用,还可以供需要对您的身份验证器处理的特定帐户类型进行身份验证的任何其他应用程序使用。
因此,当您在应用的清单中设置身份验证器时,该身份验证器会在 AccountManager
中注册。现在,如果应用使用 "com.google" 帐户类型进行身份验证,AccountManager
将使用 Google 的预注册身份验证器。如果它使用 "com.yourapp.account" 帐户类型进行身份验证,AccountManager
将改为使用您的身份验证器。
您的应用向 AccountManager
请求身份验证令牌,它转身并将请求转发给您的身份验证器。
重新阅读 Udini 的文章。代码示例演示了它们是如何组合在一起的。
在AuthenticatorActivity.java
private void finishLogin(Intent intent) {
Log.d("udinic", TAG + "> finishLogin");
String accountName = intent.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
String accountPassword = intent.getStringExtra(PARAM_USER_PASS);
final Account account = new Account(accountName, intent.getStringExtra(AccountManager.KEY_ACCOUNT_TYPE));
if (getIntent().getBooleanExtra(ARG_IS_ADDING_NEW_ACCOUNT, false)) {
Log.d("udinic", TAG + "> finishLogin > addAccountExplicitly");
String authtoken = intent.getStringExtra(AccountManager.KEY_AUTHTOKEN);
String authtokenType = mAuthTokenType;
// Creating the account on the device and setting the auth token we got
// (Not setting the auth token will cause another call to the server to authenticate the user)
mAccountManager.addAccountExplicitly(account, accountPassword, null);
mAccountManager.setAuthToken(account, authtokenType, authtoken);
} else {
Log.d("udinic", TAG + "> finishLogin > setPassword");
mAccountManager.setPassword(account, accountPassword);
}
setAccountAuthenticatorResult(intent.getExtras());
setResult(RESULT_OK, intent);
finish();
}
mAccountManager.setAuthToken(account, authtokenType, authtoken);
已设置令牌。你可以删除这一行,并添加一个新帐户,然后调用getAuthToken,该方法将被调用。
在 authenticator.xml 中设置 android:customTokens="true" 在我的 abstractaccountauthenticator 实现中启用了对 getAuthToken 方法的调用 class
我正在使用 AbstractAccountAuthenticator 的自定义实现,并且我已经按照文档实现了 getAuthToken。我一直在关注本教程:http://blog.udinic.com/2013/04/24/write-your-own-android-authenticator/
但是,我不了解何时调用 AbstractAccountAuthenticator 实现中的 getAuthToken 方法。我已经在清单中使用我创建的实现它的服务进行了设置,创建了登录页面并可以添加帐户,添加令牌并使用 AccountManager class 从我的活动代码中获取令牌,但在任何文档解释了何时调用 AbstractAccountAuthenticator 代码。
有人能帮我理解为什么我必须实施 autheniticator,但它似乎没有被使用。
那是因为你的应用程序和你的认证器之间有一个中介,它是Android的AccountManager
class.
您的身份验证器实际上是与其关联的帐户类型的 "plugin";它不仅可以供您的应用程序使用,还可以供需要对您的身份验证器处理的特定帐户类型进行身份验证的任何其他应用程序使用。
因此,当您在应用的清单中设置身份验证器时,该身份验证器会在 AccountManager
中注册。现在,如果应用使用 "com.google" 帐户类型进行身份验证,AccountManager
将使用 Google 的预注册身份验证器。如果它使用 "com.yourapp.account" 帐户类型进行身份验证,AccountManager
将改为使用您的身份验证器。
您的应用向 AccountManager
请求身份验证令牌,它转身并将请求转发给您的身份验证器。
重新阅读 Udini 的文章。代码示例演示了它们是如何组合在一起的。
在AuthenticatorActivity.java
private void finishLogin(Intent intent) {
Log.d("udinic", TAG + "> finishLogin");
String accountName = intent.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
String accountPassword = intent.getStringExtra(PARAM_USER_PASS);
final Account account = new Account(accountName, intent.getStringExtra(AccountManager.KEY_ACCOUNT_TYPE));
if (getIntent().getBooleanExtra(ARG_IS_ADDING_NEW_ACCOUNT, false)) {
Log.d("udinic", TAG + "> finishLogin > addAccountExplicitly");
String authtoken = intent.getStringExtra(AccountManager.KEY_AUTHTOKEN);
String authtokenType = mAuthTokenType;
// Creating the account on the device and setting the auth token we got
// (Not setting the auth token will cause another call to the server to authenticate the user)
mAccountManager.addAccountExplicitly(account, accountPassword, null);
mAccountManager.setAuthToken(account, authtokenType, authtoken);
} else {
Log.d("udinic", TAG + "> finishLogin > setPassword");
mAccountManager.setPassword(account, accountPassword);
}
setAccountAuthenticatorResult(intent.getExtras());
setResult(RESULT_OK, intent);
finish();
}
mAccountManager.setAuthToken(account, authtokenType, authtoken);
已设置令牌。你可以删除这一行,并添加一个新帐户,然后调用getAuthToken,该方法将被调用。
在 authenticator.xml 中设置 android:customTokens="true" 在我的 abstractaccountauthenticator 实现中启用了对 getAuthToken 方法的调用 class