我在我的Android应用程序中实现了帐户管理器。我可以添加帐户并获得auth令牌,没有任何问题,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中添加flavor时,使用signed-apk get auth令牌不起作用。 我得到了身份验证令牌:
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中调用过。
答案 0 :(得分:0)
我认为你以错误的方式蔑视了这种味道。 看一下下面的示例代码,看看如何定义一个flavor与定义一个构建类型不同:
不同的构建类型:
您可以在android {}块内的模块级build.gradle文件中创建和配置构建类型。创建新模块时,Android Studio会自动为您创建调试和发布构建类型。虽然调试版本类型没有出现在构建配置文件中,但Android Studio使用debuggable true配置它。这允许您在安全的Android设备上调试应用程序,并使用通用调试密钥库配置APK签名。
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
applicationIdSuffix ".debug"
}
}
不同的口味:
productFlavors {
demo {
applicationIdSuffix ".demo"
versionNameSuffix "-demo"
}
full {
applicationIdSuffix ".full"
versionNameSuffix "-full"
}
}
创建和配置产品风格后,单击通知栏中的“立即同步”。同步完成后,Gradle会根据您的构建类型和产品风格自动创建构建变体,并根据它们命名。例如,如果您创建了&#39; demo&#39;和#39;完整&#39;产品口味,并保持默认&#39;调试&#39;并且&#39;发布&#39;构建类型,Gradle创建以下构建变体:
demoDebug
demoRelease
fullDebug
fullRelease
执行此操作并检查问题是否仍然存在。