根据 API 级别请求权限

Request permissions based on API level

从 Android 6.0(API 级别 23)开始,我们可以在 运行 时请求权限。但是,根据文档,所有权限仍需要在 AndroidManifest.xml 中定义,因此在 API 小于 23 时,将在安装应用程序之前授予这些权限。

我只想在 运行 时请求 ACCESS_FINE_LOCATION 权限 - 因为这是一个敏感权限,在没有任何上下文的情况下在安装之前请求它会导致下载量减少。

我将我的应用定位到 API 级别 11+,所以我想知道是否可以在较早的 API 中不请求 ACCESS_FINE_LOCATION 权限(即不列出它在 AndroidManifest for APIs older than 23), and only request it for APIs 23+.

更新

为了澄清,我想知道是否可以执行以下操作:

AndroidManifest.xml

IF API_LEVEL>=23: {
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
}
ELSE:
{
}

不,这在 AndroidManifest.xml

中是不可能的

您可以在使用基于该权限的功能之前请求权限。

if (ContextCompat.checkSelfPermission(thisActivity,
                Manifest.permission.ACCESS_FINE_LOCATION) 
        != PackageManager.PERMISSION_GRANTED) {

           //Ask for permission
           ActivityCompat.requestPermissions(thisActivity,
                new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                requestCode); 

}else{

//already permitted . Do your work here..
}

现在覆盖 onRequestPermissionsResult() 方法以查看用户是否允许该请求

@Override 
public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {

            if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission is granted, Now you can execute function 

            } else { 

                // permission denied, Don't execute your function to avoid any crashes

            } 
            return; 

}

您不必在此处检查 SDK 版本 了解更多信息 click here 快乐编码:)

  • 不能请求未在清单中声明的权限。
  • 不能在运行时更改您的清单

您可以做的是 1 种风味定位 API 23+ 并声明许可 另一种风味没有针对 [=30 的许可=] 23-.

我认为你可以使用:

<uses-permission-sdk-23 android:name="string" android:maxSdkVersion="integer" />

您可以在官方文档中阅读更多相关信息:uses-permission-sdk-23