我在 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插件中的错误还是我在这里遗漏了什么。
答案 0 :(得分:1)
您正在使用 ContextCompat
的 checkSelfPermission
来检查应用程序是否具有权限。这与支持库向后兼容,但不确定与 androidx。对此的替代方法是使用 PermissionChecker
的 checkSelfPermission
api 之类的,
对于 API 级别 22 及以下,
int permission = PermissionChecker.checkSelfPermission(context, permission);
if (permission == PermissionChecker.PERMISSION_GRANTED) {
// permission is granted
} else {
// permission not granted
}
但鉴于这些权限 RECORD_AUDIO
和 WRITE_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()));
}
}