基于安全性能的考虑,android 6.0(API 23)以后,google规定了系统需要动态获取权限
一、总结需要用户手动获取的权限:
所属权限组 权限
日历 READ_CALENDAR
日历 WRITE_CALENDAR
相机 CAMERA
联系人 READ_CONTACTS
联系人 WRITE_CONTACTS
联系人 GET_ACCOUNTS
位置 ACCESS_FINE_LOCATION
位置 ACCESS_COARSE_LOCATION
麦克风 RECORD_AUDIO
电话 READ_PHONE_STATE
电话 CALL_PHONE
电话 READ_CALL_LOG
电话 WRITE_CALL_LOG
电话 ADD_VOICEMAIL
电话 USE_SIP
电话 PROCESS_OUTGOING_CALLS
传感器 BODY_SENSORS
短信 SEND_SMS
短信 RECEIVE_SMS
短信 READ_SMS
短信 RECEIVE_WAP_PUSH
短信 RECEIVE_MMS
存储 READ_EXTERNAL_STORAGE
存储 WRITE_EXTERNAL_STORAGE
需要注意的是:部分权限是属于成组出现的,比如:存储的读写权限READ_EXTERNAL_STORAGE和 WRITE_EXTERNAL_STORAGE,如果应用程序请求在AndroidManifest中列出的危险权限,并且应用程序已经在同一权限组中具有另一个危险权限,系统会立即授予权限,而不会与用户进行任何交互,。例如,如果一个应用程序先前已经请求并被授予READ_CONTACTS权限,然后它请求WRITE_CONTACTS(同属于联系人一组),系统会立即授予该权限,不会再弹出权限授予询问的对话框。

二、动态权限的申请方法:
1、首先,需要在AndroidManifest.xml静态申请权限,否则无法动态申请权限:

(需要注意权限设置的位置)
2、参考官网实现方式,在java代码中实现动态申请权限的逻辑

 public void requestPower() {    //判断是否已经赋予权限        if (ContextCompat.checkSelfPermission(this,                Manifest.permission.上表权限字符)                != PackageManager.PERMISSION_GRANTED) {           //如果应用之前请求过此权限但用户拒绝了请求,此方法将返回 true。            if (ActivityCompat.shouldShowRequestPermissionRationale(this,                    Manifest.permission.上表权限字符)) {//这里可以写个对话框之类的项向用户解释为什么要申请权限,并在对话框的确认键后续再次申请权限            } else {            //申请权限,字符串数组内是一个或多个要申请的权限,1是申请权限结果的返回参数,在onRequestPermissionsResult可以得知申请结果                ActivityCompat.requestPermissions(this,                        new String[]{Manifest.permission.上表权限字符,}, 1);            }        }    }

3、判断权限申请结果的方法(在权限申请对话框消失后执行):在Activity中,权限申请对话框消失之后,可以相应的复写 方法,监听权限申请的结果:

@Override    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        if (requestCode == 1) {            for (int i = 0; i < permissions.length; i++) {                if (grantResults[i] == PERMISSION_GRANTED) {                    Toast.makeText(this, "" + "权限" + permissions[i] + "申请成功", Toast.LENGTH_SHORT).show();                } else {                    Toast.makeText(this, "" + "权限" + permissions[i] + "申请失败", Toast.LENGTH_SHORT).show();                }            }        }    }

三、下面以文件读写权限的动态申请为例,实现简单的动态申请功能:
1.首先,在mainfest.xml文件中注册静态权限:

2.具体的在代码中实现:

 //权限动态申请    public void requestAllPower() {        if (ContextCompat.checkSelfPermission(this,                Manifest.permission.WRITE_EXTERNAL_STORAGE)                != PackageManager.PERMISSION_GRANTED) {                //如果应用之前请求过此权限但用户拒绝了请求,返回 true。            if (ActivityCompat.shouldShowRequestPermissionRationale(this,                    Manifest.permission.WRITE_EXTERNAL_STORAGE)) {            } else {                ActivityCompat.requestPermissions(this,                        new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,                                Manifest.permission.READ_EXTERNAL_STORAGE}, 1);            }        }    }

简单的动态权限申请就完成了。

更多相关文章

  1. Android动态创建快捷方式
  2. Android仿微信发送语音消息动态提示,支持上滑取消发送
  3. android的各种权限,请记得在androidmanifest.xml中声明!
  4. android中的一些权限
  5. Android中GC_EXTERNAL_ALLOC的含义小结
  6. android百度地图定位显示当前位置(android百度地图SDK系列)
  7. android 权限封装(思路来至于RxPermissions)
  8. Android应用开发提高系列(4)
  9. [置顶] 第8章android动态调试

随机推荐

  1. 配置Vim开发Android详解
  2. 2013学Android不得不看的13个视频课程(共
  3. android工程gen目录无法生成的解决办法汇
  4. android sdk 安装更新慢:下载android sdk
  5. android UI进阶之android中隐藏的layout
  6. Android(安卓)Handler
  7. cocos2d-x iOS和Android同步开发 手机设
  8. 解析Android的 消息传递机制Handler
  9. 谈谈我自己对android开发的理解
  10. android:布局参数,控件属性及各种xml的作