默认授予权限

Permissions are granted by default

我不确定我是否完全理解这一点。因此,对于 <= 21 API 版本,我们可以只使用 AndroidManifest.xml 来请求权限,但是 Lollipop 和更高的 APIs 我们有 Requesting permission on runtime 功能。所以我用这个简单的代码来使用它:

if (Build.VERSION.SDK_INT >= 23) {
    mPermissionsToBeAsked.clear();
    for (String permission : AudioRecordingThread.PERMISSIONS_NEEDED) {
        if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
            mPermissionsToBeAsked.add(permission);
        }
    } ....

然后,如果该列表不为空,我请求他们:

if (mPermissionsToBeAsked.size() > 0) {
   requestPermissions(mPermissionsToBeAsked.toArray(new String[0]), AUDIO_PERMISSIONS_REQUEST_CODE);
}

但是,出于某种原因,在设备上,例如带有 Android 6.0.1 的三星 Galaxy S7,安装应用程序时默认授予的所有权限.所以我想知道为什么,但是,还有一个更大的问题,当我在应用程序管理器中转到我的应用程序并 手动删除麦克风许可时,应用程序 checkSelfPermission(permission) 仍然返回 GRANTED。所以问题:

  1. 为什么在具有 API 级别 Lollipop 及更高级别的设备上,默认情况下仍然授予所有权限,并且上面的代码不会向 mPersmissionToBeAsked 添加任何内容?
  2. 为什么我在应用程序管理器中手动删除标题为 MICROPHONE 的权限 checkSelfPermission(android.permission.RECORD_AUDIO) 仍然 returns GRANTED?

只需在您的应用 gradle 文件中交叉验证 targetsdk 版本大于 22。

 defaultConfig {
        // -----
        targetSdkVersion 23
       //----
    }

如果小于 23,系统将自动授予您的应用权限。

首先是 Android M 及更高版本处理权限授予。这意味着你应该

targetSdkVersion 23 

或以上。否则系统认为开发者没有针对该版本,即开发者不检查权限