Android 运行时权限
概述
Android 的权限机制是用于保护用户的设备安全,主要在两个方面得到保护:
- 如果用户在低于 Android 6.0 系统的设备上安装该程序,会在安装界面给出提醒,用户可以清楚的知晓该程序一共申请了哪些权限,从而决定是否要安装这个程序
- 用户可以随时在应用程序管理界面查看任意一个程序的权限申请情况
但是很多软件都存在着滥用权限的情况,如果不同意权限申请就无法使用。因此,Android 6.0 以后加入了运行时权限功能,也就是说,用户不需要在安装软件时一次性授权所有申请的权限,而是在软件的使用过程中再对某一权限申请进行授权
当然,并不是所有权限都需要在运行时申请,对于用户来说不停的授权也很烦琐。Android 将常用权限大致归为两类:普通权限和危险权限。普通权限不会直接威胁用户的安全,对于这部分的权限申请,系统会自动帮我们进行授权。危险权限则表示那些可能会触发用户隐私或者对设备安全造成影响的权限,必须用户手动授权才行
下表列出了到 Android 10 系统为止的所有危险权限
权限组名 | 权限名 |
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, READ_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 |
申请权限
这里使用 CALL_PHONE 这个权限作为示例,该权限是编写拨打电话功能时需要声明的,被列为危险权限
修改 AndroidManifest.xml 文件,在其中声明如下权限:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.fragmenttest">
<uses-permission android:name="android.permission.CALL_PHONE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.FragmentTest">
...
</application>
</manifest>
修改 MainActivity 中的代码,定义一个按钮去触发拨打电话的逻辑
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button.setOnClickListener {
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
arrayOf(Manifest.permission.CALL_PHONE), 1)
} else {
call()
}
}
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
when (requestCode) {
1 -> {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
call()
} else {
Toast.makeText(this, "You denied the permission", Toast.LENGTH_SHORT).show()
}
}
}
}
private fun call() {
try {
val intent = Intent(Intent.ACTION_CALL)
intent.data = Uri.parse("tel:10086")
startActivity(intent)
} catch (e: SecurityException) {
e.printStackTrace()
}
}
}
首先,要判断用户是不是已经给我们授权了,借助的是 ContextCompat.checkSelfPermission()
方法,它接收两个参数:第一个参数是 Context
,第二个参数是具体的权限名。然后我们使用方法的返回值和 PackageManager.PERMISSION_GRANTED
作比较,相等就说明用户已经授权
如果已经授权,就执行拨打电话方法。如果没有授权,就需要调用 ActivityCompat.requestPermissions()
方法向用户申请授权,接收三个参数:第一个参数是 Activity
的实例,第二个参数是要申请的权限名的 String
数组,第三个是请求码,只需要是唯一值就行
调用 requestPermissions()
方法后,系统就会调用一个权限申请的对话框,用户同意或拒绝后,最终都会回调到 onRequestPermissionsResult()
方法中,授权结果会封装到 grantResults
参数当中。这里我们只需要判断最后的授权结果,并执行相应的操作即可
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgfagha
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01