【问题标题】:GrantPermissionRule stopped workingGrantPermissionRule 停止工作
【发布时间】:2018-07-18 09:58:27
【问题描述】:

我于 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 是否已停止向其他人宣传?

【问题讨论】:

  • 我也遇到了同样的问题。

标签: android testing-support-library


【解决方案1】:

我尝试过使用

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 上述行为也取决于设备。在真机 Nexus 6P 上无法使用,请尝试使用其他设备。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-02
      • 2012-06-14
      • 2019-02-07
      • 2014-07-20
      • 2015-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多