如何在 Android Marshmallow 上请求 JUnit 测试的权限

问题描述 投票:0回答:4

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

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

我尝试向测试应用程序的 MainActivity.onCreate() 添加权限请求,但没有成功,因为 MainActivity 不适用于所有测试。

有人有什么想法吗?

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

java android junit android-6.0-marshmallow android-permissions
4个回答
3
投票

自 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"

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


0
投票

Logcat 警告似乎建议使用 uiAutomation.grantRuntimePermission 而不是 pm grant。

我们可以在 kotlin 中使用(不推荐使用的方法)来代替 adb shell 命令..

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

0
投票

这是 kotlin 中的一个示例:

@RunWith(AndroidJUnit4::class)
class CameraTest {

    @Rule
    fun runtimePermissionRule() = GrantPermissionRule.grant(Manifest.permission.CAMERA)

}
© www.soinside.com 2019 - 2024. All rights reserved.