安卓棉花糖 : How to allow Runtime Permissions programatically?

标签 android automated-tests android-6.0-marshmallow android-uiautomator runtime-permissions

我正在开发一个需要一些系统权限的应用程序,但是在 Android Marshmallow 上安装时不再自动授予这些权限。

我想在运行时请求这些权限并运行某种自动化来授予它们,而无需用户在系统权限对话框出现时点击“允许”按钮。

我怎样才能做到这一点?在 Marshmallow 和更高版本中有什么办法可以做到这一点吗?

最佳答案

对于 Marshmallow 或更高版本的权限不会在安装时授予,必须在运行时需要时请求(如果之前未授予。)

为此,您需要运行 ActivityCompat.requestPermissions() 在您的 Activity 中弹出系统权限对话框,此时用户正在执行需要额外系统权限的操作。

WRITE_EXTERNAL_STORAGE 权限的示例如下:

ActivityCompat.requestPermissions(
    this, 
    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
    WRITE_EXTERNAL_STORAGE_REQUEST_CODE
);

注意:WRITE_EXTERNAL_STORAGE_REQUEST_CODE 是您应该在别处定义的任意整数常量。

您请求的权限也应该在您的 AndroidManifest.xml 中声明。在此示例中,声明为:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

为了处理系统权限对话框响应,您还需要在 Activity 中实现 onRequestPermissionsResult()。对于这个例子,代码类似于

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
    if (grantResults.length == 0 || grantResults[0] == PackageManager.PERMISSION_DENIED) {
        return; //permission not granted, could also optionally log an error
    }
    if (requestCode == WRITE_EXTERNAL_STORAGE_REQUEST_CODE) {
        //Do whatever you needed the write permissions for            
    }
}

如果您通过 Espresso 自动化您的应用程序, UIAutomator和/或其他一些 UI 测试框架,您需要在测试期间预期并单击系统对话框,这可以通过以下测试代码完成:

private void allowPermissionsIfNeeded()  {
    if (Build.VERSION.SDK_INT >= 23) {
        UiObject allowPermissions = mDevice.findObject(new UiSelector().text("Allow"));
        if (allowPermissions.exists()) {
            try {
                allowPermissions.click();
            } catch (UiObjectNotFoundException e) {
                Timber.e(e, "There is no permissions dialog to interact with ");
            }
        }
    }
}

提供了有关测试系统 UI 权限的更全面说明 here .

关于安卓棉花糖 : How to allow Runtime Permissions programatically?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41294274/

相关文章:

android - 手机锁定时键盘不显示并且 Activity 禁用键盘保护

android - Cordova:无法使用 cordova-plugin-calendar 构建项目

android - 出于什么原因我应该调用 UrlConnection.connect()

android - 如何按下前台服务通知?

ios - XCUITest - 任务终止应用程序

android - 有什么方法可以避免在 Android 上安装失败权限级别降级?

android - 世博录音webm

android - 如何在不强制输入数字的情况下默认使用 EditText 上的数字键盘?

python - Qt 的 Squish 替代品

testing - 拖动点不起作用并且不会引发错误