Android GrantPermissionRule在api-27上无法正常工作

8

我已在我的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


出于好奇,RuleChain 对你在 CI 上有帮助吗? - rahul.taicho
2个回答

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
我建议您使用一个带有外部权限规则的RuleChain来处理ActivityScenarioRule周围的权限。
问题似乎源于通过场景规则启动活动和权限规则之间的竞争,使用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()));
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接