检查新的权限模型

时间:2015-09-28 17:24:28

标签: android android-permissions android-6.0-marshmallow appcompat-v7-r23

我正在针对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" />

使用Appcompatv7-r23在API23上定位应用,在仿真器设备Android 6.0上通过adb安装已签名的应用并运行它: 在运行时没有任何新的事情发生,该应用程序在API 23之前运行良好,似乎所有这些权限都会在安装时自动授予。

我为RECORD_AUDIO权限插入ContextCompat.checkSelfPermission(),很快就会返回&#34; PERMISSION_GRANTED&#34;。

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

3 个答案:

答案 0 :(得分:0)

它仍处于危险类别,并且在安装时未授予这些应用,仅限Android M

答案 1 :(得分:0)

您需要在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
    }
}

答案 2 :(得分:0)

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