【问题标题】:How to request permissions on Android Marshmallow for JUnit tests如何为 JUnit 测试请求 Android Marshmallow 的权限
【发布时间】:2016-12-29 15:24:24
【问题描述】:

我想对我的 lib 执行 JUnit 测试,并希望在测试开始之前要求用户授予所有必需的权限(例如,因为我需要在自动化测试期间从设备存储中读取一些文件)。

我知道如何通过向 gradle 添加任务并从 cmd 运行它来实现它,它运行良好。但是当我使用 IDE 运行测试时,我需要询问用户(或自动执行)。

我尝试向测试应用的 MainActivity.onCreate() 添加权限请求,但没有成功,因为 MainActivity 并非针对所有测试启动。

有人有什么想法吗?

另外,请不要谈论将 gradle grant 任务添加到执行配置中。它正在工作但无法使用,需要更统一的东西。

【问题讨论】:

  • 试试这个它可能是工作 stackoverflow.com/a/41221852/5488468
  • 对不起,这不是我的问题。我的问题是关于 JUnit 测试
  • 你好 pbelov,我也面临同样的问题。你解决了那个问题吗?如果是怎么办?
  • 您可以使用 GrantPermissionRule。请检查这个答案stackoverflow.com/a/46660384/2465752

标签: java android junit android-6.0-marshmallow android-permissions


【解决方案1】:

更好的方法,因为 API 版本 23 (Android M):

@Rule
public GrantPermissionRule mRuntimePermissionRule = GrantPermissionRule.grant(Manifest.permission.ACCESS_FINE_LOCATION);
...

【讨论】:

    【解决方案2】:

    我找到了解决问题的方法。很简单:

    需要在应用级build.gradle 文件中创建一个新任务,如下所示:

    android.applicationVariants.all { variant ->
        def applicationId = variant.applicationId
        def adb = android.getAdbExe().toString()
        def variantName = variant.name.capitalize()
        def grantPermissionTask = tasks.create("create${variantName}Permissions") << {
            println "Granting permissions"
            "${adb} shell pm grant ${applicationId} android.permission.ACCESS_FINE_LOCATION".execute()
            "${adb} shell pm grant ${applicationId} android.permission.WRITE_EXTERNAL_STORAGE".execute()
            "${adb} shell pm grant ${applicationId} android.permission.READ_EXTERNAL_STORAGE".execute()
        }
    }
    

    然后添加以下依赖:

    preBuild.dependsOn "createDebugPermissions"
    

    之后,当您运行任何测试时,将授予所有必需的权限

    【讨论】:

      【解决方案3】:

      Logcat 警告似乎在推荐 uiAutomation.grantRuntimePermission 而不是 pm grant。

      除了 adb shell 命令,我们可以在 kotlin 中使用(不推荐使用的方法)..

      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      getInstrumentation().uiAutomation.grantRuntimePermission(ApplicationProvider.getApplicationContext<Context>().packageName, "android.permission.BLUETOOTH")
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-24
        • 2016-02-29
        • 1970-01-01
        • 1970-01-01
        • 2016-03-13
        • 2015-12-23
        • 2016-08-15
        • 1970-01-01
        相关资源
        最近更新 更多