1

我已经在我的 android 应用程序中实现了帐户管理器。我可以毫无问题地添加帐户并获取身份验证令牌,并且签名 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 中添加风味时,在签名的 apk 中获取身份验证令牌不起作用。我得到身份验证令牌是这样的:

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 方法从未在签名 apk 中调用。

4

1 回答 1

0

我认为你以错误的方式拒绝了这种味道。查看下面的示例代码,了解定义风格与定义构建类型有何不同:

不同的构建类型:

您可以在 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 会根据您的构建类型和产品风格自动创建构建变体,并根据 . 例如,如果您创建了“演示”和“完整”产品风格,并保留了默认的“调试”和“发布”构建类型,Gradle 会创建以下构建变体:

  • 演示调试

  • 演示发布

  • 全调试

  • 完全释放

这样做并检查问题是否仍然存在。

于 2016-12-31T10:42:07.753 回答