權限檢測基類
abstract class BasePermissionsActivity : AppCompatActivity() {
private val permissionsRequestCode = 100
//判斷是否需要檢測,防止不停的彈框
private var isNeedCheck = true
private lateinit var permissionsDialog: PermissionsDialog
abstract fun getLayoutResID(): Int
//需要授權的數組
abstract fun permissionsList(): Array<String>
//授權成功回調
abstract fun successCallback()
override fun onCreate(savedInstanceState: Bundle?) {
//防止截屏攻擊風險
window.addFlags(WindowManager.LayoutParams.FLAG_SECURE)
//仿系統自帶短信界面 可以完全漂浮在軟鍵盤之上
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE or WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN)
super.onCreate(savedInstanceState)
setContentView(getLayoutResID())
permissionsDialog = PermissionsDialog()
}
/**
* 申請權限
*/
override fun onResume() {
super.onResume()
if (isNeedCheck) {
initRequestPermission(permissionsList())
} else {
isNeedCheck = true
}
}
/**
* 公共方法:初始化時統一申請權限
*/
private fun initRequestPermission(@NonNull permissions: Array<String>) {
val needRequestPermissionList = ArrayList<String>()
for (permission in permissions) {
//如果沒有授權放入待授權集合
if (ContextCompat.checkSelfPermission(
this,
permission
) != PackageManager.PERMISSION_GRANTED
) {
needRequestPermissionList.add(permission)
}
}
//將待授權集合轉換爲數組並申請授權
val array = needRequestPermissionList.toTypedArray()
if (array.isNotEmpty()) {
ActivityCompat.requestPermissions(this, array, permissionsRequestCode)
} else {
successCallback()
}
}
/**
* 授權回調
*/
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
if (requestCode == permissionsRequestCode) {
verifyPermissions(grantResults)
}
}
/**
* 判斷授權是否成功
*/
private fun verifyPermissions(grantResults: IntArray) {
for (result in grantResults) {
if (result != PackageManager.PERMISSION_GRANTED) {
showDialog()
return
}
}
successCallback()
}
/**
* 拒接授權彈出提示框
*/
private fun showDialog() {
permissionsDialog.show(supportFragmentManager, localClassName)
isNeedCheck = false
}
}
彈窗
import android.app.Dialog
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.provider.Settings
import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.DialogFragment
class PermissionsDialog : DialogFragment() {
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
activity?.run {
return with(AlertDialog.Builder(this)) {
setTitle("提示")
setMessage("在設置-應用-權限中開啓所需權限,以保證功能的正常使用")
// 拒絕, 退出應用
setNegativeButton("退出") { _, _ ->
finish()
}
setPositiveButton("設置") { _, _ ->
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
intent.data = Uri.parse("package:$packageName")
startActivity(intent)
dismiss()
}
setCancelable(false)
create()
}
}
return super.onCreateDialog(savedInstanceState)
}
}
使用
class PermissionsActivity : BasePermissionsActivity() {
override fun getLayoutResID(): Int {
return R.layout.activity_permissions
}
override fun permissionsList(): Array<String> {
return arrayOf()
}
override fun successCallback() {
startActivity(Intent(this,MainActivity::class.java))
finish()
}
}