获取验证令牌在帐户管理器中不起作用

问题描述:

我在我的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" 

    } 
} 

但在签署-APK获取身份验证令牌时味道的gradle中添加不起作用。 我获得身份验证令牌,因为这:

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(); 
     } 
    } 

而且我得到这个错误时调用 '捆绑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中调用过。

我认为,你已经以错误的方式否定了这种风味。 看看下面的示例代码来看看如何定义一个味道是从定义生成类型不同:

不同的生成类型:

您可以创建和配置在模块级生成类型android {}块内的build.gradle文件。当您创建新模块时,Android Studio会自动为您创建调试版本和发布版本类型。尽管调试构建类型没有出现在构建配置文件中,但Android Studio使用可调试的构造它。这使您可以在安全的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将根据您的构建类型和产品风格自动创建构建变体,并根据其命名。例如,如果你创建了“演示”和“全”产品的口味,并保持默认的“调试”和“释放”生成类型,摇篮创建以下构建变种:

  • demoDebug

  • demoRelease

  • fullDebug

  • fullRelease

做到这一点,并检查问题是否仍然存在。