如何为 JUnit 测试请求 Android Marshmallow 的权限
How to request permissions on Android Marshmallow for JUnit tests
我想对我的库执行 JUnit 测试,并希望在测试开始前要求用户获得所有必需的权限(因为我需要在自动测试期间从设备存储中读取一些文件例如)。
我知道如何通过向 gradle 和 运行 添加任务来从 cmd 中添加任务,它运行良好。但是当我 运行 我的测试 使用 IDE.
时,我需要询问用户(或自动执行)
我尝试向测试应用程序的 MainActivity.onCreate() 添加权限请求,但没有成功,因为 MainActivity 并非针对所有测试启动。
有没有人有什么想法?
此外,请不要谈论将 gradle g运行t 任务添加到执行配置中。它可以工作但无法使用,需要更统一的东西。
我找到了解决问题的方法。很简单:
需要在应用级 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"
之后,当您 运行 任何测试
时,将授予所有必需的权限
更好的方法,因为 API 版本 23 (Android M):
@Rule
public GrantPermissionRule mRuntimePermissionRule = GrantPermissionRule.grant(Manifest.permission.ACCESS_FINE_LOCATION);
...
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")
}
我想对我的库执行 JUnit 测试,并希望在测试开始前要求用户获得所有必需的权限(因为我需要在自动测试期间从设备存储中读取一些文件例如)。
我知道如何通过向 gradle 和 运行 添加任务来从 cmd 中添加任务,它运行良好。但是当我 运行 我的测试 使用 IDE.
时,我需要询问用户(或自动执行)我尝试向测试应用程序的 MainActivity.onCreate() 添加权限请求,但没有成功,因为 MainActivity 并非针对所有测试启动。
有没有人有什么想法?
此外,请不要谈论将 gradle g运行t 任务添加到执行配置中。它可以工作但无法使用,需要更统一的东西。
我找到了解决问题的方法。很简单:
需要在应用级 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"
之后,当您 运行 任何测试
时,将授予所有必需的权限更好的方法,因为 API 版本 23 (Android M):
@Rule
public GrantPermissionRule mRuntimePermissionRule = GrantPermissionRule.grant(Manifest.permission.ACCESS_FINE_LOCATION);
...
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")
}