Android:运行时权限的简单使用——以拨打电话为例
(2023-06-16 22:10:10)| 分类: androidios |
什么是运行时权限?
所谓运行时权限也就是说在应用程序使用的过程中需要手动进行授权的权限。Android 6.0 以后,Android官方就添加了这项功能,不同于只需要在 AndroidManifest.xml 文件中声明的普通权限,运行时权限都是一些涉及用户隐私的权限。
在本教程中,我们以申请拨打电话权限 CALL_PHONE 为例。在 Android 中,还有一个与拨打电话权限类似的权限:打开拨号盘 DIAL。这两者的区别主要是前者是直接拨打电话,而后者只是打开拨号盘自动填充电话号码,并不拨打出去,在使用时注意区别。
须知
运行时权限其实并不囊括所有的权限;
事实上,Android中的权限大致分为三类:
普通权限:联网、打开拨号盘等;
**危险权限:**触及用户的安全和隐私的权限,例如:直接拨号(涉及资费)、读取通讯录等(涉及隐私)。
正因为危险,所以这才是运行时权限的范畴;至于有哪些,可以自行上网搜索。
特殊权限:使用较少,不做讨论。
运行时权限也需要在
AndroidManifest.xml 文件中注册声明。
流程
在这里插入图片描述
步骤
1.在AndroidManifest.xml文件中注册权限
这没什么好说的,不注册会导致程序出错。在application同级标签添加如下代码:
1
2
2.检查拨打电话权限是否授权
接下来就是要检查申请的运行时权限用户是否授权过,这么做的原因是:直接使用某个运行时权限而不经过判断的话,程序是会出错闪退的(*用户之后随时可以在设置里取消某项运行时权限也会导致程序出错),这会严重影响用户体验,这一步也是最重要的。
//
用户未授权过申请
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE)
!= PackageManager.PERMISSION_GRANTED){
// 那就向系统申请权限...
}
//
用户已经授权过申请
else {
// 发起拨号
val intent = Intent(Intent.ACTION_CALL)
intent.data
= Uri.parse("tel://10086")
startActivity(intent)
}
1
2
3
4
5
6
7
8
9
10
11
12
这里的重点是ContextCompat.checkSelfPermission()方法,通过方法检查到某项权限是否申请,然后与成功授权的常量PackageManager.PERMISSION_GRANTED(同意为0,拒绝为-1)进行比对就行了,不相等说明未经过授权。
这里需要两个参数:
参数名称
参数类型
参数说明
context
Context
上下文
权限名称
String
权限名称
3.发送权限申请
假如权限没有授权过,我们就发送权限申请,在未授权的逻辑分支里添加代码如下:
ActivityCompat.requestPermissions(
this,
arrayOf(Manifest.permission.CALL_PHONE),
123
)
1
2
3
4
5
方法:ActivityCompat.requestPermissions()
需要三个参数:
参数名称
参数类型
参数说明
context
Context
上下文
权限数组
String[]
把权限名称放入即可
requestCode
Int
请求码,便于识别和保证唯一就行了
4.进入回调
发送权限申请后,无论用户是否同意,都会进入到onRequestPermissionsResult回调方法里来,而授权的结果就封装在grantResults参数中。回调方法如下:
override fun onRequestPermissionsResult(
requestCode:
Int,
permissions:
Array,
grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions,
grantResults)
}
1
2
3
4
5
6
重写该回调方法后,在方法里加入判断:
//
所谓运行时权限也就是说在应用程序使用的过程中需要手动进行授权的权限。Android 6.0 以后,Android官方就添加了这项功能,不同于只需要在 AndroidManifest.xml 文件中声明的普通权限,运行时权限都是一些涉及用户隐私的权限。
在本教程中,我们以申请拨打电话权限 CALL_PHONE 为例。在 Android 中,还有一个与拨打电话权限类似的权限:打开拨号盘 DIAL。这两者的区别主要是前者是直接拨打电话,而后者只是打开拨号盘自动填充电话号码,并不拨打出去,在使用时注意区别。
须知
流程
在这里插入图片描述
步骤
1.在AndroidManifest.xml文件中注册权限
这没什么好说的,不注册会导致程序出错。在application同级标签添加如下代码:
2.检查拨打电话权限是否授权
接下来就是要检查申请的运行时权限用户是否授权过,这么做的原因是:直接使用某个运行时权限而不经过判断的话,程序是会出错闪退的(*用户之后随时可以在设置里取消某项运行时权限也会导致程序出错),这会严重影响用户体验,这一步也是最重要的。
//
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE)
}
//
else {
}
这里的重点是ContextCompat.checkSelfPermission()方法,通过方法检查到某项权限是否申请,然后与成功授权的常量PackageManager.PERMISSION_GRANTED(同意为0,拒绝为-1)进行比对就行了,不相等说明未经过授权。
这里需要两个参数:
参数名称
context
权限名称
3.发送权限申请
假如权限没有授权过,我们就发送权限申请,在未授权的逻辑分支里添加代码如下:
ActivityCompat.requestPermissions(
)
方法:ActivityCompat.requestPermissions()
需要三个参数:
参数名称
context
权限数组
requestCode
4.进入回调
发送权限申请后,无论用户是否同意,都会进入到onRequestPermissionsResu
override fun onRequestPermissionsResu
}
重写该回调方法后,在方法里加入判断:
//

加载中…