Android GrantPermissionRule 不适用于 api-27

时间:2021-05-22 15:15:52

标签: android android-fragments android-permissions androidx android-testing

我在 MainActivityTest 类中配置了如下权限规则

@Rule
public GrantPermissionRule permissionRule =
    GrantPermissionRule.grant(RECORD_AUDIO, WRITE_EXTERNAL_STORAGE);

当我运行下面的命令以使用 api 27 在模拟器上执行测试时

./gradlew connectedCheck

失败并出现以下错误

com.example.myapplication.MainActivityTest > testLaunch_main_activity[Pixel_XL_API_27(AVD) - 8.1.0] FAILED 
        androidx.test.espresso.NoActivityResumedException: No activities in stage RESUMED. Did you forget to launch the activity. (test.getActivity() or similar)?
        at dalvik.system.VMStack.getThreadStackTrace(Native Method)

令人惊讶的是,权限在应用信息设置中显示为已授予,但在 api 版本 27(或更低版本)的模拟器上运行测试时仍然要求权限

有人可以确认这是一些android插件中的错误还是我在这里遗漏了什么。

源代码 - https://github.com/vivekweb2013/test-android-project

2 个答案:

答案 0 :(得分:1)

您正在使用 ContextCompatcheckSelfPermission 来检查应用程序是否具有权限。这与支持库向后兼容,但不确定与 androidx。对此的替代方法是使用 PermissionCheckercheckSelfPermission api 之类的,

对于 API 级别 22 及以下,

int permission = PermissionChecker.checkSelfPermission(context, permission);

if (permission == PermissionChecker.PERMISSION_GRANTED) {
    // permission is granted
} else {
    // permission not granted
}

但鉴于这些权限 RECORD_AUDIOWRITE_EXTERNAL_STORAGE 是危险的权限,在我们的应用程序开始使用它之前需要用户的确认。在 API 级别 23 以下,这些权限在 AndroidManifest 中声明时会自动授予,因此解决此问题的另一种方法可以是仅针对 API 级别 23+ 进行验证,因为验证是有意义的。

答案 1 :(得分:0)

我建议您使用带有外部规则的 RuleChain 来获取 ActivityScenarioRule 周围的权限

问题似乎来自于通过场景规则和权限规则启动 Activity 之间的竞争,有了 RuleChain,执行顺序变得明确,行为应该符合预期。

这是您示例中的更新代码:

public class MainActivityTest {
    public GrantPermissionRule permissionRule =
          GrantPermissionRule.grant(RECORD_AUDIO, WRITE_EXTERNAL_STORAGE);

    public ActivityScenarioRule<MainActivity> rule = new ActivityScenarioRule<>(MainActivity.class);

    @Rule
    public RuleChain chain = RuleChain.outerRule(permissionRule).around(rule);

    @Test
    public void testLaunch_main_activity() {
        onView(withId(R.id.txt_view)).check(matches(isDisplayed()));
    }
}
相关问题