推荐大神–众所周知的郭神
注意Android13权限细化后申请流程
1、封装权限申请工具
object PermissionUtils {
val ACTIVITY_GRANTED = 1
val FRAGMENT_GRANTED = 2
val ACTIVITY_DENIED = 3
val FRAGMENT_DENIED = 4
/**
* 申请权限
*/
fun getPermissions (activity: FragmentActivity?, fragment: Fragment?, permissions: List<String>) {
val msg = Message()
val bundle = Bundle()
if (activity != null) {
PermissionX.init(activity)
.permissions(permissions)
.onExplainRequestReason { scope, deniedList ->
scope.showRequestReasonDialog(
deniedList,
"需要您同意以下权限才能正常使用",
"确认",
"取消"
)
}
.onForwardToSettings { scope, deniedList ->
scope.showForwardToSettingsDialog(
deniedList,
"为保障软件运行,您需手动开启必要的权限",
"确认",
"取消"
)
}
.request { allGranted, grantedList, deniedList ->
if (allGranted) {
msg.what = ACTIVITY_GRANTED
bundle.putStringArray("grantedList",grantedList.toTypedArray())
} else {
msg.what = ACTIVITY_DENIED
bundle.putStringArray("deniedList",deniedList.toTypedArray())
}
bundle.putBoolean("allGranted",allGranted)
msg.data = bundle
mHandler.sendMessage(msg)
}
} else if (fragment != null) {
PermissionX.init(fragment)
.permissions(permissions)
.onExplainRequestReason { scope, deniedList ->
scope.showRequestReasonDialog(
deniedList,
"为保障软件运行,需要您同意以下权限",
"确认",
"取消"
)
}
.onForwardToSettings { scope, deniedList ->
scope.showForwardToSettingsDialog(
deniedList,
"为保障软件运行,您需手动开启必要的权限",
"确认",
"取消"
)
}
.request { allGranted, grantedList, deniedList ->
if (allGranted) {
msg.what = FRAGMENT_GRANTED
bundle.putStringArray("grantedList",grantedList.toTypedArray())
LogUtils.debugInfo("fragment所有权限已获取:${grantedList}")
} else {
val msg = Message()
msg.what = FRAGMENT_DENIED
bundle.putStringArray("deniedList",deniedList.toTypedArray())
}
bundle.putBoolean("allGranted",allGranted)
msg.data = bundle
mHandler.sendMessage(msg)
}
}
}
/**
* 权限申请监听回调
*/
var monPermissionListener: onPermissionListener? = null
fun setOnPermissionListener(monPermissionListener: onPermissionListener?) {
this.monPermissionListener = monPermissionListener
}
interface onPermissionListener {
fun getResult(data: Bundle, tid: String)
}
@SuppressLint("HandlerLeak")
var mHandler: Handler = object : Handler() {
override fun handleMessage(msg: Message) {
super.handleMessage(msg)
when (msg.what) {
ACTIVITY_GRANTED_RESULT ->{
if (monPermissionListener != null) {
val result = msg.data
if (monPermissionListener != null) {
monPermissionListener?.getResult(result, "")
}
}
}
FRAGMENT_GRANTED_RESULT ->{
if (monPermissionListener != null) {
val result = msg.data
if (monPermissionListener != null) {
monPermissionListener?.getResult(result, "")
}
}
}
ACTIVITY_DENIED_RESULT ->{
if (monPermissionListener != null) {
val result = msg.data
if (monPermissionListener != null) {
monPermissionListener?.getResult(result, "")
}
}
}
FRAGMENT_DENIED_RESULT->{
if (monPermissionListener != null) {
val result = msg.data
if (monPermissionListener != null) {
monPermissionListener?.getResult(result, "")
}
}
}
else->{}
}
}
}
var listPermission = mutableListOf<String>()
/**
* 检查权限
*/
fun checkPermission(context: Context, permissions: List<String>) :List<String> {
permissions.forEach {
if (!PermissionX.isGranted(context, it)) {
if (!listPermission.contains(it)) {
listPermission.add(it)
}
}
}
return listPermission
}
}
2、调用权限申请
val permissionList = mutableListOf<String>(
Manifest.permission.CAMERA)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
permissionList.add(Manifest.permission.READ_MEDIA_IMAGES)
permissionList.add(Manifest.permission.READ_MEDIA_AUDIO)
permissionList.add(Manifest.permission.READ_MEDIA_VIDEO)
} else {
permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE)
permissionList.add(Manifest.permission.READ_EXTERNAL_STORAGE)
}
PermissionUtils.getPermissions(this@PDFPreviewActivity, null, permissionList)
PermissionUtils.setOnPermissionListener(object : PermissionUtils.onPermissionListener {
override fun getResult(data: Bundle, tid: String) {
if (data.getBoolean("allGranted")) {
// 获取权限后 想干的事情。。。。。
}
}
})