Android アプリにアカウント マネージャーを実装しました。問題なくアカウントを追加して認証トークンを取得でき、signed-apk も正しく動作します。build.grade に新しいフレーバーを追加するまで、フローは完全に機能していました。
productFlavors {
release {
applicationId "com.faranegar.flight.release"
versionName "1.0.0"
buildConfigField 'String', 'BASE_API', '"http://release.mysite.ir/api/"'
buildConfigField 'String', 'BASE_MOBILE_API', '"https://releaseapp.mysite.ir/api/"'
}
demo {
applicationId "com.faranegar.flight.demo"
buildConfigField 'String', 'BASE_API', '"http://demo.mysite.ir/api/"'
buildConfigField 'String', 'BASE_MOBILE_API', '"http://demoapp.mysite.ir/api/"'
versionName "1.0.0"
}
}
しかし、Gradle にフレーバーが追加されている場合、signed-apk get auth token は機能しません。次のように認証トークンを取得します。
final AccountManager accountManager = AccountManager.get(context);
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.GET_ACCOUNTS) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
ActivityCompat.requestPermissions((Activity) context,
new String[]{Manifest.permission.GET_ACCOUNTS},
Constants.GET_ACCOUNT_PERMISSION);
return;
}
final Account[] accounts = accountManager.getAccountsByType(AccountGeneral.ACCOUNT_TYPE);
for (final Account account : accounts) {
if (account.name.equals(Utils.getUserName(context))) {
final AccountManagerFuture<Bundle> future = accountManager.getAuthToken(account, AccountGeneral.ACCOUNT_TYPE, null, (Activity) context, null, null);
new Thread(new Runnable() {
@Override
public void run() {
try {
((Activity)context).runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(context, "bundle token", Toast.LENGTH_SHORT).show();
}
});
Bundle bnd = future.getResult();
final String authtoken = bnd.getString(AccountManager.KEY_AUTHTOKEN);
accountControllerListener.onGetToken(authtoken);
} catch (final Exception e) {
sendErrorToRetrofit(e);
e.printStackTrace();
}
}
}).start();
}
}
「Bundle bnd = future.getResult();」を呼び出すと、このエラーが発生します。
android.accounts.AccountManager.convertErrorToException(AccountManager.java:2153)
android.accounts.AccountManager.access$500(AccountManager.java:149)
android.accounts.AccountManager$AmsTask$Response.onError(AccountManager.java:1996) android.accounts.IAccountManagerResponse$Stub.onTransact(IAccountManagerResponse.java:69)
android.os.Binder.execTransact(Binder.java:453)
注: 追跡したところ、MyAuthenticator の getAuthToken メソッドが signed-apk で呼び出されていないことがわかりました。