安卓开发入门教程-运行时权限
发布日期:2021-06-29 18:30:00
浏览次数:2
分类:技术文章
本文共 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)申请权限
- 在模块build.gradle文件中添加第三方库(SoulPermission)依赖
implementation 'com.qw:soulpermission:1.3.0'
- 在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控件学习系列
关注头条号,第一时间获取最新文章:
转载地址:https://cxyxy.blog.csdn.net/article/details/107681326 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
感谢大佬
[***.8.128.20]2024年04月19日 09时16分05秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Android集成佳博热敏打印机打印小票对齐问题
2019-04-30
Java面向对象练习-实现员工管理系统(MySQL数据库存储)
2019-04-30
CSR BC417143BGQ蓝牙模块芯片替换方案
2019-04-30
TP6 绑定admin/index模块 登录管理 (多应用设置)
2019-04-30
vue+element封装分页组件<每页条数由用户自定义>
2019-04-30
在ubuntu下的命令窗口输入git log后怎么退出?
2019-04-30
github在ubuntu下使用教程
2019-04-30
ROS gazebo 模型导入
2019-04-30
启用IIS6的gzip压缩图文讲解
2019-04-30
SQL Server 的事务日志意外增大或充满的处理方法
2019-04-30
如何让MIS系统反应更快?
2019-04-30
Iframe用法精析
2019-04-30
.net2008自带的Sql Server2005Express不能安装的解决方案
2019-04-30
存储过程--sqlerver2000从已知表导出insert语句
2019-04-30
关于TransactionScope出错:“与基础事务管理器的通信失败”的解决方法
2019-04-30
Jquery基本用法总结--很有用!
2019-04-30
Sql Server中的修复命令
2019-04-30