检查新的权限模型

Checking the new permission model

我正在根据 Android 6.0

上的新权限模型检查我的应用的权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

将应用程序定位到 API23 上,使用 Appcompatv7-r23,通过 adb 在模拟器设备 Android 6.0 和 运行 上安装已签名的应用程序: 在运行时没有任何新变化,该应用程序与之前一样运行良好 API 23,而且似乎所有这些权限都是在安装时自动授予的。

我插入 ContextCompat.checkSelfPermission() 以获得 RECORD_AUDIO 许可,很快就会 returns "PERMISSION_GRANTED"。

这三个权限是否可能被新权限模型保留为不危险? 我的测试有效吗?

它仍属于危险类别,未在安装时授予这些应用程序,针对 Android M

您需要 运行 在 M 设备上才能看到该行为。较旧的 SDK 手机将授予安装权限。这些权限需要实施新模型,否则您的应用会在新设备上安装后崩溃。

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

Android M Permissions

您需要根据需要检查每个权限,然后在授予权限后使用回调方法来实现功能。

if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
        != PackageManager.PERMISSION_GRANTED) {

    // Should we show an explanation?
    if (shouldShowRequestPermissionRationale(
            Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
        // Explain to the user why we need to read the write to storage
    }

    requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
            MY_PERMISSIONS_WRITE_EXTERNAL_STORAGE);

    // MY_PERMISSIONS_WRITE_EXTERNAL_STORAGE is an
    // app-defined int constant

    return;
}

@Override
public void onRequestPermissionsResult(int requestCode,
    String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_WRITE_EXTERNAL_STORAGE: {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, yay! do the
                // calendar task you need to do.

            } else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            return;
        }

    // other 'switch' lines to check for other
    // permissions this app might request
    }
}

我的测试无效,因为模拟器不是 API23 平台上的 运行,尽管我在设备定义上选择了 API23。