GrantPermissionRule停止工作

时间:2018-02-07 23:43:17

标签: android testing-support-library

我在1/3/2018的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:浓咖啡核: '3.0.1'
  • com.android.support.test:转轮: '1.0.1'

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

3 个答案:

答案 0 :(得分:4)

我尝试使用

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

这不起作用。当我运行espresso测试时,权限警报仍会显示。这对我来说很有用:

@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");
    }
}

答案 1 :(得分:0)

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

答案 2 :(得分:0)

就我而言,我试图在 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"
        )
    }
}