Android 各种版本号与权限

https://blog.csdn.net/gaolh89/article/details/79809034

获取当前系统SDK版本 即手机系统版本 Build.VERSION.SDK_INT

buildeToolVersion是你构建工具的版本,其中包括了打包工具aapt、dx等等。这个工具的目录位于…your_sdk_path/build-tools/XX.XX.XX

这个版本号一般是API-LEVEL.0.0。 例如I/O2014大会上发布了API20对应的build-tool的版本就是20.0.0

compileSdkVersion

代码中获取 compileSdkVersion ::

  • compileSdkVersion 告诉 Gradle 用哪个 Android SDK 版本编译你的应用。使用任何新添加的 API 就需要使用对应 Level 的 Android SDK。

  • 修改 compileSdkVersion 不会改变运行时的行为你修改了 compileSdkVersion 的时候,可能会出现新的编译警告、编译错误,但新的 compileSdkVersion 不会被包含到 APK 中:它纯粹只是在编译的时候使用。(你真的应该修复这些警告,他们的出现一定是有原因的)

  • 强烈推荐总是使用最新的 SDK 进行编译。在现有代码上使用新的编译检查可以获得很多好处,避免新弃用的 API ,并且为使用新的 API 做好准备。

  • 如果使用 Support Library ,那么使用最新发布的 Support Library 就需要使用最新的 SDK 编译。例如,要使用 23.1.1 版本的 Support Library ,compileSdkVersion 就必需至少是 23 (大版本号要一致!

  • buildToolsVersion。它是用于指定项目构建工具的版本.比如27.0.2。如果有更新的版本,Android Studio会进行提示

minSdkVersion

代码中获取 context.getApplicationInfo().targetSdkVersion

  • compileSdkVersion 设置为可用的最新 API,那么 minSdkVersion 则是应用可以运行的最低要求。minSdkVersion 是 各大Android应用商店用来判断用户设备是否可以安装某个应用的标志之一

  • lint 默认会在项目中运行,它在你使用了高于 minSdkVersion 的 API 时会警告你,帮你避免调用不存在的 API 的运行时问题。如果只在较高版本的系统上才使用某些 API,通常使用运行时检查系统版本的方式解决

  • 你所使用的库,如 Support Library 或 Google Play services,可能有他们自己的 minSdkVersion 。你的应用设置的 minSdkVersion 必需大于等于这些库的 minSdkVersion 。例如有三个库,它们的 minSdkVersion 分别是 4, 7 和 9 ,那么你的 minSdkVersion 必需至少是 9 才能使用它们。在少数情况下,你仍然想用一个比你应用的 minSdkVersion 还高的库(处理所有的边缘情况,确保它只在较新的平台上使用),你可以使用 tools:overrideLibrary 标记,但请做彻底的测试!

targetSdkVersion

  • targetSdkVersion 是 Android 提供向前兼容的主要依据,在应用的 targetSdkVersion 没有更新之前系统不会应用最新的行为变化。这允许你在适应新的行为变化之前就可以使用新的 API (因为你已经更新了 compileSdkVersion 不是吗?)。

  • targetSdkVersion指定的值表示你在该目标版本上已经做过了充分的测试,系统将会为你的应用程序启用一些最新的功能和特征。比如,Android 6.0 系统引用了运行时权限这个功能,如果你将targetSdkVersion 指定为23或者更高,那么系统就会为你的程序启动运行时权限。如果你将targetSdkVersion 指定为22,那么就说明你的程序最高只在Android 5.1系统上做过充分的测试,Android6.0系统中引入的新功能就不会启动了。

  • 比如你将targetSdkVersion 设置为22,涉及某个(或某几个)权限,你直接在mainfest中配置权限即可,然后在java代码中进行获取权限后的逻辑处理即可。但如果你将targetSdkVersion 设置为23或更高,你除了在mainfest中配置权限外,还需要在java代码中判断用户是否同意权限,如果同意,执行什么业务操作;如果不同意,执行什么业务操作(一般是提示某某权限被拒后,某某功能无法正常使用).如果你只在mainfest中配置了权限,targetSdkVersion 又大于等于23,Java代码中不进行运行时权限的代码,你的应用程序就直接报错了。

#综合来看

minSdkVersion<=targetSdkVersion<=compileSdkVersion

理想上,在稳定状态下三者的关系应该更像这样:

minSdkVersion (lowest possible) <= targetSdkVersion == compileSdkVersion (latest SDK)
用较低的 minSdkVersion 来覆盖最大的人群,用最新的 SDK 设置 targetSdkVersion 和 compileVersion 来获得最好的外观和行为。

Android 应用权限

从 Android 6.0(API 级别 23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授予。此方法可以简化应用安装过程,因为用户在安装或更新应用时不需要授予权限。它还让用户可以对应用的功能进行更多控制;例如,用户可以选择为相机应用提供相机访问权限,而不提供设备位置的访问权限。用户可以随时进入应用的“Settings”屏幕调用权限。
系统权限分为两类:正常权限和危险权限

  1. if(targetSdkVersion(App) < 23 && Build.VERSION.SDK_INT(手机版本) < 23)
    安装APP时,会声明App所需要的权限,不会询问用户.也不可以关闭权限(部分国产定制机型除外Xiaomi就在6.0之前就已经提出了一套自己的权限系统.)

  2. if(targetSdkVersion < 23 && Build.VERSION.SDK_INT >= 23)表示App并未兼容6.0,安装App时,也不会让用户动态申请权限,但是用户可以自行去设置页面关闭权限,

  3. if(targetSdkVersion >= 23 && Build.VERSION.SDK_INT < 23) 同1.所述,也是仅仅在安装App时提示,声明App所需要的权限,不会询问用户动态申请,也不可以关闭.

  4. if(targetSdkVersion >= 23 && Build.VERSION.SDK_INT >= 23) 动态申请权限.也是大势所趋.

  • 正常权限不会直接给用户隐私权带来风险。如果您的应用在其清单中列出了正常权限,系统将自动授予该权限。
  • 危险权限会授予应用访问用户机密数据的权限。如果您的应用在其清单中列出了正常权限,系统将自动授予该权限。如果您列出了危险权限,则用户必须明确批准您的应用使用这些权限
  • 特殊(Signature)权限,这个分类呢,可以说对于用户来说,更危险的权限。特别敏感的权限。此类权限不能在App内弹出系统的权限申请框。只能跳转到设置页面修改。比如 修改系统设置,悬浮窗
public class Permissions {

  protected static String[] ABS_CALENDAR;
  protected static String[] ABS_CAMERA;
  protected static String[] ABS_CONTACTS;
  protected static String[] ABS_LOCATION;
  protected static String[] ABS_MICROPHONE;
  protected static String[] ABS_PHONE;
  protected static String[] ABS_SENSORS;
  protected static String[] ABS_SMS;
  protected static String[] ABS_STORAGE;

  static {

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
      ABS_CALENDAR = new String[] {};
      ABS_CAMERA = new String[] {};
      ABS_CONTACTS = new String[] {};
      ABS_LOCATION = new String[] {};
      ABS_MICROPHONE = new String[] {};
      ABS_PHONE = new String[] {};
      ABS_SENSORS = new String[] {};
      ABS_SMS = new String[] {};
      ABS_STORAGE = new String[] {};
    } else {
      ABS_CALENDAR = new String[] {
          Manifest.permission.READ_CALENDAR, Manifest.permission.WRITE_CALENDAR
      };

      ABS_CAMERA = new String[] {
          Manifest.permission.CAMERA
      };

      ABS_CONTACTS = new String[] {
          Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS,
          Manifest.permission.GET_ACCOUNTS
      };

      ABS_LOCATION = new String[] {
          Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION
      };

      ABS_MICROPHONE = new String[] {
          Manifest.permission.RECORD_AUDIO
      };

      ABS_PHONE = new String[] {
          Manifest.permission.READ_PHONE_STATE, Manifest.permission.CALL_PHONE,
          Manifest.permission.READ_CALL_LOG, Manifest.permission.WRITE_CALL_LOG,
          Manifest.permission.USE_SIP, Manifest.permission.PROCESS_OUTGOING_CALLS
      };

      ABS_SENSORS = new String[] {
          Manifest.permission.BODY_SENSORS
      };

      ABS_SMS = new String[] {
          Manifest.permission.SEND_SMS, Manifest.permission.RECEIVE_SMS,
          Manifest.permission.READ_SMS, Manifest.permission.RECEIVE_WAP_PUSH,
          Manifest.permission.RECEIVE_MMS
      };

      ABS_STORAGE = new String[] {
          Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE
      };
    }
  }
}

暂时分为9个权限组,这些权限,作为动态申请中,可能涉及到主要内容。(注:申请同一权限组内的子权限,系统弹出的权限申请框中的文案是一样的。)

android8.0 (26)权限策略变化

在 Android 8.0 之前,如果应用在运行时请求权限并且被授予该权限,系统会错误地将属于同一权限组并且在清单中注册的其他权限也一起授予应用。
对于针对 Android 8.0 的应用,此行为已被纠正。系统只会授予应用明确请求的权限。然而,一旦用户为应用授予某个权限,则所有后续对该权限组中权限的请求都将被自动批准。
例如,假设某个应用在其清单中列出 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE。应用请求 READ_EXTERNAL_STORAGE,并且用户授予了该权限。如果该应用针对的是 API 级别 24 或更低级别,系统还会同时授予 WRITE_EXTERNAL_STORAGE,因为该权限也属于同一 STORAGE 权限组并且也在清单中注册过。如果该应用针对的是 Android 8.0,则系统此时仅会授予 READ_EXTERNAL_STORAGE;不过,如果该应用后来又请求 WRITE_EXTERNAL_STORAGE,则系统会立即授予该权限,而不会提示用户。

  • 以前,申请一个子权限会自动获取权限组中其他子权限。组内其他子权限可以直接使用。
  • 现在,申请一个子权限,组内其他子权限不会自动获取。使用组内其他子权限的时候。需要再次申请。(但是这种情况不会弹出系统的权限申请框)如果不申请。会FC。

贴一个开源的权限请求库
https://github.com/getActivity/XXPermissions

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值