11

我于 2018 年 1 月 3 日在我的 Android 应用程序中成功实施的 GrantPermissionRule 不再有效。当我通过 Android Studio 运行 Espresso 测试时,模拟器会阻塞等待权限。但是,当我从命令行运行测试时,./gradlew dist; ./gradlew connectedDebugAndroidTest --stacktrace它不会请求权限。注意我会在每次运行之前手动擦除模拟器中的数据,以确保它是对 GrantPermissionRule 的正确测试。

以下是我用来实现 GrantPermissionRule 的原始参考资料: https://www.kotlindevelopment.com/runtime-permissions-espresso-done-right/ https://developer.android.com/reference/android/support/test/rule /GrantPermissionRule.html

app/build.gradle 中的版本:

  • com.android.support.test.espresso:espresso-core:'3.0.1'
  • com.android.support.test:runner:'1.0.1'

GrantPermissionRule 是否已停止向其他人宣传?

4

3 回答 3

6

我尝试使用

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

这没有用。当我运行浓缩咖啡测试时,权限警报仍然出现。不过,这一直对我有用:

@Before
public void grantPhonePermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        getInstrumentation().getUiAutomation().executeShellCommand(
                "pm grant " + getTargetContext().getPackageName()
                        + " android.permission.ACCESS_FINE_LOCATION");
    }
}
于 2018-04-02T18:23:53.223 回答
1

就我而言,我试图在Emulator Pixel 2 API R上的 Espresso UI 测试中自动化位置权限。

用例 1:

当我在GrantPermissionRule中同时添加 ACCESS_FINE_LOCATION 和 ACCESS_COARSE_LOCATION 时,运行时权限弹出窗口不会自动消失。

不工作:

@Rule
@JvmField
val grantPermissionRule: GrantPermissionRule = 
GrantPermissionRule.grant(android.Manifest.permission.ACCESS_FINE_LOCATION, 
android.Manifest.permission.ACCESS_COARSE_LOCATION)

然后我从GrantPermissionRule 中删除了ACCESS_COARSE_LOCATION并且自动化开始工作。

在职的:

@Rule
@JvmField
val grantPermissionRule: GrantPermissionRule = 
GrantPermissionRule.grant(android.Manifest.permission.ACCESS_FINE_LOCATION) 

用例 2:

也低于上述(失败/成功)用例的实现。

不工作:

@Before
fun grantPhonePermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        getInstrumentation().uiAutomation.executeShellCommand(
            "pm grant " + getApplicationContext<Context>()
                .packageName
                    + " android.permission.ACCESS_FINE_LOCATION"
        )
        getInstrumentation().uiAutomation.executeShellCommand(
            "pm grant " + getApplicationContext<Context>()
                .packageName
                    + " android.permission.ACCESS_COARSE_LOCATION"
        )
    }
}

在职的:

@Before
fun grantPhonePermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        getInstrumentation().uiAutomation.executeShellCommand(
            "pm grant " + getApplicationContext<Context>()
                .packageName
                    + " android.permission.ACCESS_FINE_LOCATION"
        )
    }
}
于 2020-04-17T15:55:17.557 回答
0

问题似乎已经消失,可能是因为我不得不降级 Android Emulator 以解决另一个问题(Here's How to downgrade Android Emulator)。

于 2018-04-04T19:10:22.933 回答