Skip to content

Commit

Permalink
使用新的权限请求框架
Browse files Browse the repository at this point in the history
  • Loading branch information
caoyanglee committed Nov 15, 2021
1 parent 8216513 commit 70d0a42
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 88 deletions.
31 changes: 4 additions & 27 deletions app/src/main/java/com/pmm/demo/module/test/TestActivity.kt
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
package com.pmm.demo.module.test

import android.Manifest
import android.app.Activity
import android.os.Bundle
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.ViewModelProvider
import by.kirich1409.viewbindingdelegate.viewBinding
import com.afollestad.assent.Permission
import com.afollestad.assent.askForPermissions
import com.orhanobut.logger.Logger
import com.pmm.demo.R
import com.pmm.demo.base.BaseViewActivityV2
import com.pmm.demo.databinding.ActivityTestBinding
Expand Down Expand Up @@ -47,15 +44,10 @@ class TestActivity : BaseViewActivityV2(R.layout.activity_test) {

mVB.mBtn5.click {
this.requestPermission(
Permission.RECORD_AUDIO,
Manifest.permission.READ_EXTERNAL_STORAGE,
allGrantedCallback = { toast("拿到权限了") },
allDeniedCallback = {
toast("所有权限都拒绝了")
true
},
permanentlyDeniedCallback = {
toast("有权限被永久拒绝了")
true
denyCallback = {
toast("权限被拒绝了")
},
message = "您需要给小盛权限,才能正常访问存储文件哦"
)
Expand All @@ -78,19 +70,4 @@ class TestActivity : BaseViewActivityV2(R.layout.activity_test) {
super.onResume()
mVB.vNavigationBar.text = "导航条高度:${px2dip(getNavigationBarHeight().toFloat())}单位"
}


//检查定位权限
fun FragmentActivity.requestLocationPermissions(
allGrantedCallback: () -> Unit,
permanentlyDeniedCallback: (() -> Boolean)? = null
) {
requestPermission(
Permission.ACCESS_FINE_LOCATION,
Permission.ACCESS_COARSE_LOCATION,
allGrantedCallback = allGrantedCallback,
permanentlyDeniedCallback = permanentlyDeniedCallback,
message = "需要获取您的位置信息才能给你服务"
)
}
}
2 changes: 1 addition & 1 deletion lib/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ dependencies {
//event bus
api 'org.greenrobot:eventbus:3.2.0'
//permission
api 'com.afollestad.assent:core:3.0.0-RC4'
api 'com.guolindev.permissionx:permissionx:1.6.1'
//glide
api 'com.github.bumptech.glide:glide:4.11.0'
kapt 'com.github.bumptech.glide:compiler:4.11.0'
Expand Down
106 changes: 46 additions & 60 deletions lib/src/main/java/com/pmm/ui/ktx/DialogKt.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,20 @@

package com.pmm.ui.ktx

import android.Manifest
import android.annotation.SuppressLint
import android.content.ContextWrapper
import androidx.fragment.app.FragmentActivity
import com.afollestad.assent.Permission
import com.afollestad.assent.askForPermissions
import com.afollestad.assent.isAllGranted
import com.afollestad.materialdialogs.DialogCallback
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.callbacks.onDismiss
import com.afollestad.materialdialogs.list.listItems
import com.afollestad.materialdialogs.list.listItemsSingleChoice
import com.permissionx.guolindev.PermissionX
import com.pmm.ui.R


typealias DialogCallBack = (() -> Unit)//适用各种回调
typealias DialogCallBack = (() -> Unit)?//适用各种回调

/**
*
Expand All @@ -29,71 +28,55 @@ typealias DialogCallBack = (() -> Unit)//适用各种回调
*/
@SuppressLint("CheckResult")
fun FragmentActivity.requestPermission(
vararg permissions: Permission,
allGrantedCallback: (() -> Unit)? = null,
allDeniedCallback: (() -> Boolean)? = null,
permanentlyDeniedCallback: (() -> Boolean)? = null,
vararg permissions: String,
allGrantedCallback: DialogCallBack = null,
denyCallback: DialogCallBack = null,
//以下都是权限提示弹窗
bgCornerRadius: Float = 16f,
message: String = "无此权限app有可能无法正常运行!",
positiveStr: String = baseContext.getString(R.string.dialog_action_ok),
positiveCallback: (() -> Boolean)? = null,
negativeStr: String? = baseContext.getString(R.string.dialog_action_cancel),
negativeCallback: DialogCallBack? = null,
) {
val activity = this

//权限弹窗
fun showDialog(isPermanentlyDenied: Boolean) {
MaterialDialog(this).show {
cancelable(false)
cornerRadius(bgCornerRadius)
title(R.string.dialog_title_default)
message(text = message)
positiveButton(text = positiveStr) {
if (positiveCallback?.invoke() == true) return@positiveButton
if (isPermanentlyDenied)
activity.openAppInfoPage()
else
activity.requestPermission(
permissions = permissions,
allGrantedCallback = allGrantedCallback,
permanentlyDeniedCallback = permanentlyDeniedCallback,
message = message,
positiveStr = positiveStr,
positiveCallback = positiveCallback,
negativeStr = negativeStr,
negativeCallback = negativeCallback
)
}
negativeButton(text = negativeStr) {
negativeCallback?.invoke()
//开始请求权限
PermissionX.init(this)
.permissions(*permissions)
.onExplainRequestReason { scope, deniedList ->
scope.showRequestReasonDialog(
deniedList,
message,
positiveStr,
negativeStr
)
}
//.explainReasonBeforeRequest()
.onForwardToSettings { scope, deniedList ->
scope.showForwardToSettingsDialog(deniedList, message, positiveStr, negativeStr)
}
.request { allGranted, grantedList, deniedList ->
if (allGranted) {
allGrantedCallback?.invoke()
} else {
denyCallback?.invoke()
}
}
}
//开始请求权限
}


val permissionsGranted: Boolean = isAllGranted(*permissions)
if (permissionsGranted) {
allGrantedCallback?.invoke()
} else {
askForPermissions(*permissions) {
when {
it.isAllGranted(*permissions) -> {
allGrantedCallback?.invoke()
}
it.permanentlyDenied().isNotEmpty() -> {
if (permanentlyDeniedCallback?.invoke() == true) return@askForPermissions
showDialog(true)
}
else -> {
if (allDeniedCallback?.invoke() == true) return@askForPermissions
showDialog(false)
}
@SuppressLint("CheckResult")
fun FragmentActivity.requestPermissionWithoutDialog(
vararg permissions: String,
allGrantedCallback: (() -> Unit)? = null,
denyCallback: DialogCallBack = null,
) {
//开始请求权限
PermissionX.init(this)
.permissions(*permissions)
.request { allGranted, grantedList, deniedList ->
if (allGranted) {
allGrantedCallback?.invoke()
} else {
denyCallback?.invoke()
}
}

}
}

/**
Expand Down Expand Up @@ -144,7 +127,10 @@ fun ContextWrapper.showSingleChoicePicker(
MaterialDialog(this).show {
cornerRadius(bgCornerRadius)
title(text = title)
listItemsSingleChoice(items = items, initialSelection = selectedIndex) { dialog, index, text ->
listItemsSingleChoice(
items = items,
initialSelection = selectedIndex
) { dialog, index, text ->
dialog.dismiss()
callBack.invoke(dialog, index, text)
}
Expand Down

0 comments on commit 70d0a42

Please sign in to comment.