什么是運(yùn)行時(shí)權(quán)限
為了更好的保護(hù)用戶隱私及安全,安卓自6.0版本開始,引入運(yùn)行時(shí)動態(tài)權(quán)限檢查機(jī)制.應(yīng)用需要訪問一些涉及用戶隱私及安全權(quán)限時(shí),應(yīng)用需要調(diào)用系統(tǒng)權(quán)限檢查接口,查看是否已獲得權(quán)限,如果沒有,則由系統(tǒng)彈出權(quán)限申請窗口,由用戶決定是否允許使用相應(yīng)權(quán)限.
基礎(chǔ)樣例
下面例子中將申請打電話權(quán)限并完成打電話功能.
使用安卓原生方式申請權(quán)限
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button.setOnClickListener { applyPermissionAndCall() }
}
/**
* 先檢查權(quán)限好唯,如果已經(jīng)獲得權(quán)限扮休,直接撥打電話;
* 否則申請權(quán)限猫态。
*/
private fun applyPermissionAndCall() {
if (hasPermission()) {
call()
} else {
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CALL_PHONE), 1)
}
}
/**
* 檢查是否有權(quán)限
*/
private fun hasPermission(): Boolean {
val result = ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE)
return result == PackageManager.PERMISSION_GRANTED
}
/**
* 處理申請權(quán)限的結(jié)果脸哀,如果獲得了權(quán)限图筹,則撥打電話篇裁,否則toast報(bào)錯(cuò)。
*/
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
when (requestCode) {
1 -> {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
call()
} else {
toast("沒權(quán)限吵护,打不了??")
}
}
}
}
/**
* 調(diào)用系統(tǒng)打電話功能盒音,撥打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)申請權(quán)限
- 在模塊build.gradle文件中添加第三方庫(SoulPermission)依賴
implementation 'com.qw:soulpermission:1.3.0'
- 在activity中調(diào)用
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button.setOnClickListener { applyPermissionAndCall() }
}
/**
* 先申請權(quán)限,再打電話
*/
private fun applyPermissionAndCall() {
SoulPermission.getInstance()
.checkAndRequestPermission(
Manifest.permission.CALL_PHONE,
object : CheckRequestPermissionListener {
override fun onPermissionOk(permission: Permission) {
call()
}
override fun onPermissionDenied(permission: Permission) {
toast("沒權(quán)限馅而,打不了??")
}
})
}
/**
* 調(diào)用系統(tǒng)打電話功能祥诽,撥打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()
}
完整源代碼
https://gitee.com/lblbc/permission-demo
申請多個(gè)權(quán)限樣例
private fun applyPermissionAndPhoto() {
SoulPermission.getInstance()
.checkAndRequestPermissions(
Permissions.build(
Manifest.permission.CAMERA,
Manifest.permission.WRITE_EXTERNAL_STORAGE
),
object : CheckRequestPermissionsListener {
override fun onAllPermissionOk(allPermissions: Array<out Permission>?) {
photo()
}
override fun onPermissionDenied(refusedPermissions: Array<out Permission>?) {
}
})
}