博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
安卓开发入门教程-运行时权限
阅读量:1894 次
发布时间:2019-04-26

本文共 3345 字,大约阅读时间需要 11 分钟。

关注 ,免费获取全套安卓开发学习资料

什么是运行时权限

为了更好的保护用户隐私及安全,安卓自6.0版本开始,引入运行时动态权限检查机制.应用需要访问一些涉及用户隐私及安全权限时,应用需要调用系统权限检查接口,查看是否已获得权限,如果没有,则由系统弹出权限申请窗口,由用户决定是否允许使用相应权限.

基础样例

下面例子中将申请打电话权限并完成打电话功能.

使用安卓原生方式申请权限

class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) button.setOnClickListener {
applyPermissionAndCall() } } /** * 先检查权限,如果已经获得权限,直接拨打电话; * 否则申请权限。 */ private fun applyPermissionAndCall() {
if (hasPermission()) {
call() } else {
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CALL_PHONE), 1) } } /** * 检查是否有权限 */ private fun hasPermission(): Boolean {
val result = ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) return result == PackageManager.PERMISSION_GRANTED } /** * 处理申请权限的结果,如果获得了权限,则拨打电话,否则toast报错。 */ override fun onRequestPermissionsResult( requestCode: Int, permissions: Array
, grantResults: IntArray ) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults) when (requestCode) {
1 -> {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
call() } else {
toast("没权限,打不了😢") } } } } /** * 调用系统打电话功能,拨打10086 */ private fun call() {
try {
val intent = Intent(Intent.ACTION_CALL) intent.data = Uri.parse("tel:10086") startActivity(intent) } catch (e: SecurityException) {
e.printStackTrace() } } private fun toast(text: String) = Toast.makeText(this, text, Toast.LENGTH_SHORT).show()}

使用第三方开源库(SoulPermission)申请权限

  1. 在模块build.gradle文件中添加第三方库(SoulPermission)依赖
implementation 'com.qw:soulpermission:1.3.0'
  1. 在activity中调用
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) button.setOnClickListener {
applyPermissionAndCall() } } /** * 先申请权限,再打电话 */ private fun applyPermissionAndCall() {
SoulPermission.getInstance() .checkAndRequestPermission( Manifest.permission.CALL_PHONE, object : CheckRequestPermissionListener {
override fun onPermissionOk(permission: Permission) {
call() } override fun onPermissionDenied(permission: Permission) {
toast("没权限,打不了😢") } }) } /** * 调用系统打电话功能,拨打10086 */ private fun call() {
try {
val intent = Intent(Intent.ACTION_CALL) intent.data = Uri.parse("tel:10086") startActivity(intent) } catch (e: SecurityException) {
e.printStackTrace() } } private fun toast(text: String) = Toast.makeText(this, text, Toast.LENGTH_SHORT).show()}

完整源代码


安卓开发入门教程系列汇总

开发语言学习

UI控件学习系列

关注头条号,第一时间获取最新文章:

转载地址:http://czodf.baihongyu.com/

你可能感兴趣的文章
开源项目|RT-Thread 软件包应用作品:小闹钟
查看>>
在 RT-Thread Studio 上使用 RT-Thread Nano
查看>>
开源项目|软件包应用作品:通用物联网系统平台
查看>>
【经验分享】RT-Thread UART设备驱动框架初体验(中断方式接收带\r\n的数据)
查看>>
单片机里面的CPU使用率是什么鬼?
查看>>
推荐一个优质Linux技术公众号-作者都是一线Linux代码贡献者们哦
查看>>
RT-Thread 编程风格指南
查看>>
95后高校电子教师,软硬兼修有趣有料!
查看>>
使用 STM32 通用 Bootloader ,让 OTA 更加 Easy
查看>>
Cache 的基本概念与工作原理
查看>>
装机量超亿台 RISC-V +IoT OS!中科蓝讯与RT-Thread战略合作,共推自主物联网生态发展
查看>>
Android程序员必备!面试一路绿灯Offer拿到手软,Android面试题及解析
查看>>
Android开发知识体系!腾讯+字节+阿里面经真题汇总,成功入职阿里
查看>>
typescript学习(进阶)
查看>>
三天敲一个前后端分离的员工管理系统
查看>>
EL表达式、JSTL标签库、文件上传和下载
查看>>
Cookie、Session
查看>>
表单重复提交
查看>>
Filter
查看>>
微服务架构实施原理详解
查看>>