一、什么是动态权限?
在android6.0前,所有的权限都只需要在Manifest中写。如图所示
那么为什么6.0后需要添加运行时权限?
因为现在很多的软件为了以防万一,都先将权限申请完。比如明明一个计时器软件,却需要用户授权相册,联系人等权限。如果不授权,就不给用。为了改变这种情况,则在6.0后推出了运行时权限。用户不必再安装软件时就授权所有的权限,而是在运行时需要用到什么权限就申请什么权限。
当然android一共有一百多种权限,如果全部运行时申请的话,又未免过于繁琐,所以只需要申请一些重要的权限。因此android将所有的权限分为两种,一种为普通权限,直接在清单文件中申请即可。另一种是危险权限,涉及用户利益的,比如隐私,资费等,就需要运行时进行申请。
二、有哪些运行时权限?
这里将其列出,一共9组24个。需要注意的是,权限按组分类,当一个权限被同意时,同一组内的权限自动同时被授权。
权限组名 | 权限名称 |
---|---|
CALENDAR(日历) | READ_CALENDAR |
WRITE_CALENDAR | |
CAMERA(相机) | CAMERA |
CONTACTS(联系人) | READ_CONTACTS |
WRITE_CONTACTS | |
GET_ACCOUNTS | |
LOCATION(位置) | ACCESS_FINE_LOCATION |
ACCESS_COARSE_LOCATION | |
MICROPHONE(麦克风) | RECORD_AUDIO |
PHONE(手机) | READ_PHONE_STATE |
CALL_PHONE | |
ERAD_CALL_LOG | |
WRITE_CALL_LOG | |
ADD_VOICEMAIL | |
USE_SIP | |
PROCESS_OUTGOING_CALLS | |
SENSORS(传感器) | BODY_SENSORS |
SMS(短信) | SEND_SMS |
RECEIVE_SMS | |
READ_SMS | |
RECEIVE_WAP_PUSH | |
RECEIVE_MMS | |
STORAGE(存储卡) | READ_EXTERNAL_STORAGE |
WRITE_EXTERNAL_STORAGE |
三、怎么使用?
注:之前一直有误会。别的讲的也模糊不清。不管是不是危险权限,都需要现在清单文件中列出来,危险权限在代码中还需要额外再申请。
按照以下3步进行,这里以打电话权限为例。因为打电话可能涉及用户的话费,所以列为危险权限。
1、为了防止重复授权,需要进行检查是否已经用户授权。
checkSelfPermission(@NonNull Context context, @NonNull String permission)
第一参数传入上下文
第二参数则是需要申请的权限,以字符串的形式。
PackageManager.PERMISSION_GRANTED
如果等于,则说明已经授权
2、没有授权,就开始授权
requestPermissions(final @NonNull Activity activity,
final @NonNull String[] permissions, final @IntRange(from = 0) int requestCode)
第一参数 常量activity 和上下文好像没有太多区别
第二参数 字符串组 用来输入需要的权限
第三参数 申请码 自定义随便输,只需要唯一就可
3、开始调打电话的方法
//第一步,判断是否已经授权
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE)
!= PackageManager.PERMISSION_GRANTED){
//第二步,如果没有授权,就授权
ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CALL_PHONE},1);
}else{
call();//第三步开始打电话
}
这里采用《android 第一行代码》里面的运行效果图。运行后,会跳出一个对话框,请求权限