Android M(6.0)API 23后加入了权限请求设置,APP需要使用某些权限需要主动申请。


权限分为3类,一组是Normal权限,无需申请,另一组是Dangerous,需申请,然后是特殊权限,需申请。

先看下Normal权限列表:


再看下Dangerous权限列表:


危险权限实际上才是运行时权限主要处理的对象,这些权限可能引起隐私问题或者影响其他程序运行。Android中的危险权限可以归为以下几个分组:

CALENDAR
CAMERA
CONTACTS
LOCATION
MICROPHONE
PHONE
SENSORS
SMS
STORAGE
各个权限分组与其具体的权限,可以参考下图:



想要不支持运行时权限机制很简单,只需要将targetSdkVersion设置低于23就可以了,意思是告诉系统,我还没有完全在API 23(6.0)上完全搞定,不要给我启动新的特性。


特殊权限:

就是一些特别敏感的权限,在Android系统中,主要由两个

  • SYSTEM_ALERT_WINDOW,设置悬浮窗,进行一些黑科技
  • WRITE_SETTINGS 修改系统设置

关于上面两个特殊权限的授权,做法是使用startActivityForResult启动授权界面来完成。


请求SYSTEM_ALERT_WINDOW

private static final int REQUEST_CODE = 1;private  void requestAlertWindowPermission() {    Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);    intent.setData(Uri.parse("package:" + getPackageName()));    startActivityForResult(intent, REQUEST_CODE);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {    super.onActivityResult(requestCode, resultCode, data);    if (requestCode == REQUEST_CODE) {        if (Settings.canDrawOverlays(this)) {            Log.i(LOGTAG, "onActivityResult granted");        }    }}


上述代码需要注意的是

  • 使用Action Settings.ACTION_MANAGE_OVERLAY_PERMISSION启动隐式Intent
  • 使用"package:" + getPackageName()携带App的包名信息
  • 使用Settings.canDrawOverlays方法判断授权结果

请求WRITE_SETTINGS

private static final int REQUEST_CODE_WRITE_SETTINGS = 2;private void requestWriteSettings() {    Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);    intent.setData(Uri.parse("package:" + getPackageName()));    startActivityForResult(intent, REQUEST_CODE_WRITE_SETTINGS );}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {    super.onActivityResult(requestCode, resultCode, data);    if (requestCode == REQUEST_CODE_WRITE_SETTINGS) {        if (Settings.System.canWrite(this)) {            Log.i(LOGTAG, "onActivityResult write settings granted" );        }    }}

上述代码需要注意的是

  • 使用Action Settings.ACTION_MANAGE_WRITE_SETTINGS 启动隐式Intent
  • 使用"package:" + getPackageName()携带App的包名信息
  • 使用Settings.System.canWrite方法检测授权结果
注意:关于这两个特殊权限,一般不建议应用申请。

其实你不需要每个权限都去显式申请,举一个例子,如果你的应用授权了读取联系人的权限,那么你的应用也是被赋予了写入联系人的权限。因为读取联系人和写入联系人这两个权限都属于联系人权限分组,所以一旦组内某个权限被允许,该组的其他权限也是被允许的。



更多相关文章

  1. EventBus源码详解(一):基本使用
  2. Android(安卓)实现蓝牙录音
  3. Android之存储目录
  4. Android复习笔记(7) -发送广播
  5. Android采用AIDL实现两个应用间通信
  6. android--理解和使用自定义权限
  7. android 万能视频播放器
  8. Mac系统配置Android(安卓)Studio的gradle命令
  9. Android文件访问权限

随机推荐

  1. Window7 环境下 MariaDB 的安装 及使用
  2. MySQL翻页查询技巧
  3. 请问MySql 可以处理8千万条以上的记录吗,
  4. mysql启动脚本——指定数据目录并指定配
  5. PHP OOP和MySQLi连接=致命错误:调用未定
  6. InnoDB瓶颈:放宽ACID以提高性能
  7. Hive安装与部署集成mysql
  8. 0926MySQL中ICP索引下推
  9. 【转载】----CentOS 6.5下安装MySQL 5.6.
  10. 安装mysql5.7解压包中遇见的问题