目录
1.需要动态申请权限的原因
2.Android权限动态申请
1.需要动态申请权限的原因
首先,Android权限分为大致两类,一类是普通权限,一类是危险权限,准确地讲其实还有一些特殊的权限,不过这些权限使用得相对较少,我们大致跳过.对于普通权限,系统会自动帮我们进行授权,由于Android对用户的保护,我们通常在进行涉及到危险权限的时候,需要进行动态声明,不然无法通过,会对程序终止,且发出异常
例子如下:
我已经在清单文件中进行权限申请了,但是仍然会出现如下的异常,这是因为>=Android6.0认为打电话是一个危险的权限需要我们进行动态声明
2.Android权限动态申请
package com.quick.testmyphone import android.Manifest import android.content.Intent import android.content.pm.PackageManager import android.net.Uri import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.view.View import android.widget.Button import android.widget.Toast import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat class MainActivity : AppCompatActivity() { private lateinit var mBtn: Button override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) mBtn = findViewById(R.id.call) mBtn.setOnClickListener { /** * 判断用户是否已经给过了对应的权限: * 利用ContextCompat.checkSelfPermission方法 (参数一:上下文,参数二:对应的权限名称) 的返回值与 * PackageManager.PERMISSION_GRANTED 做比较,相等代表已经声明权限 */ if (ContextCompat.checkSelfPermission(MainActivity@this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED ) { /** * 如果不相等,那么调用ActivityCompat.requestPermissions 方法进行权限申明 参数一:上下文, 参数二: string数组用于填写权限名, 参数三: 请求码,唯一值即可 */ ActivityCompat.requestPermissions( MainActivity@this, arrayOf(Manifest.permission.CALL_PHONE), 1 ) } else { // 如果已经声明了权限那么直接就进行打电话操作 callPhone() } } } override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<out String>, grantResults: IntArray ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) when(requestCode) { 1 -> { /** * 由于授权的结果会封装在grantResults 数组中,我们可以进行非空判断后 取出 与 PackageManager.PERMISSION_GRANTED作对比 */ if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { callPhone() } else { /** * 当用户拒绝的话,显示一个吐司的效果,提醒用户 */ Toast.makeText( MainActivity@this, "You denied the perssion", Toast.LENGTH_SHORT ).show() } } } } fun callPhone() { /** * 进行打电话操作 */ val mIntent = Intent(Intent.ACTION_CALL).apply { data = Uri.parse("tel:10086") } startActivity(mIntent) } }
上述代码运行后的效果:文章来源:https://www.toymoban.com/news/detail-828634.html
文章来源地址https://www.toymoban.com/news/detail-828634.html
到了这里,关于Android动态申请权限(运行时申请权限)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!