【问题标题】:Request permissions based on API level根据 API 级别请求权限
【发布时间】:2016-07-02 07:44:49
【问题描述】:

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

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

我将我的应用程序定位到 API 级别 11+,所以我想知道是否可以不在旧 API 中请求 ACCESS_FINE_LOCATION 权限(即对于 23 岁以上的 API,不在 AndroidManifest 中列出它),并且只请求它适用于 API 23+。

更新

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

AndroidManifest.xml

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

【问题讨论】:

  • 在运行时,如果 version>=23 则按版本检查权限,而不是检查运行时权限,否则什么都不做......
  • @Er.Arjunsaini,我不需要在 AndroidManifest.xml 中静态列出这些权限吗?
  • "在所有版本的 Android 上,您的应用都需要在其应用清单中声明其所需的正常权限和危险权限,如声明权限中所述。"
  • 如果您尝试同时使用 NETWORK_PROVIDER 和 GPS_PROVIDER,那么您需要请求 ACCESS_FINE_LOCATION 权限,因为它包含两个提供者的权限。
  • 简单直接的答案:

标签: android android-manifest android-permissions


【解决方案1】:

我认为你可以这样做:

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

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

【讨论】:

  • 很高兴它能帮到你。最好的问候。
【解决方案2】:
  • 不能请求 Manifest 中未声明的权限。
  • 不能在运行时更改您的Manifest

您可以做的是制作一种针对API 23+的风格,并声明了权限,而另一种风格没有针对API 23-的权限

【讨论】:

    【解决方案3】:

    不,这在 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 快乐编码:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-19
      • 1970-01-01
      • 1970-01-01
      • 2012-12-04
      • 2021-05-05
      • 2016-07-03
      • 2012-06-06
      • 1970-01-01
      相关资源
      最近更新 更多