修改EasyPermissions默認(rèn)的請求權(quán)限的彈窗,改自定義彈窗
方式一:本地加載庫,直接修改源碼壶运,簡單粗暴,這個就不描述了
方式二:使用hook浪秘,參考大佬的實現(xiàn)(還沒測試蒋情,提供一個想法),傳送門>>>https://juejin.cn/post/6954922378442833934
方式三:復(fù)制源碼兩個類改改耸携,直接解決棵癣,廢話少說,直接上代碼
第一個類
//ActivityPermissionsHelper (來自源碼)發(fā)起權(quán)限請求用的夺衍,我這里的host是Activity
class ActivityPermissionsHelper(
host: Activity
): PermissionsHelper<Activity>(host) {
companion object {
private var instance: ActivityPermissionsHelper? = null
fun newInstance(host: Activity): ActivityPermissionsHelper {
return instance?: synchronized(this){
instance?:ActivityPermissionsHelper(host).also {
instance = it
}
}
}
}
var dialog:RationaleDialog?=null
override var context: Context? = host
override fun directRequestPermissions(requestCode: Int, perms: Array<out String>) {
ActivityCompat.requestPermissions(host, perms, requestCode)
}
override fun shouldShowRequestPermissionRationale(perm: String): Boolean {
return ActivityCompat.shouldShowRequestPermissionRationale(host, perm)
}
override fun showRequestPermissionRationale(permissionRequest: PermissionRequest) {
dialog?.dismissDialog()
dialog = RationaleDialog(host, permissionRequest);
dialog?.showCompatDialog()
}
fun dismissDialog() {
dialog?.dismissDialog()
}
}
第二個類
//RationaleDialog(來自源碼)這里就是重點了狈谊,把showDialog()方法里的Dialog,就是改成你自己的
class RationaleDialog(
private val context: Context,
private val model: PermissionRequest
) : DialogInterface.OnClickListener {
private val permissionCallbacks: EasyPermissions.PermissionCallbacks?
get() = if (context is EasyPermissions.PermissionCallbacks) context else null
private val rationaleCallbacks: EasyPermissions.RationaleCallbacks?
get() = if (context is EasyPermissions.RationaleCallbacks) context else null
private var dialog:AlertDialog? = null
/**
* Display the dialog.
*/
fun showCompatDialog() {
dialog?.dismiss()
dialog = AlertDialog.Builder(context, model.theme)
.setCancelable(false)
.setMessage(model.rationale)
.setPositiveButton(model.positiveButtonText, this)
.setNegativeButton(model.negativeButtonText, this)
.show()
dialog?.getButton(android.app.AlertDialog.BUTTON_POSITIVE)?.setTextColor(Color.BLUE)
dialog?.getButton(android.app.AlertDialog.BUTTON_NEGATIVE)?.setTextColor(Color.BLACK)
}
fun dismissDialog(){
dialog?.dismiss()
}
fun showDialog() {
android.app.AlertDialog.Builder(context, model.theme)
.setCancelable(false)
.setMessage(model.rationale)
.setPositiveButton(model.positiveButtonText, this)
.setNegativeButton(model.negativeButtonText, this)
.show()
}
override fun onClick(dialogInterface: DialogInterface?, buttonType: Int) {
when (buttonType) {
Dialog.BUTTON_POSITIVE -> {
rationaleCallbacks?.onRationaleAccepted(model.code)
when (context) {
is Fragment ->
PermissionsHelper
.newInstance(context)
.directRequestPermissions(model.code, model.perms)
is Activity ->
PermissionsHelper
.newInstance(context)
.directRequestPermissions(model.code, model.perms)
is AppCompatActivity ->
PermissionsHelper
.newInstance(context)
.directRequestPermissions(model.code, model.perms)
}
}
Dialog.BUTTON_NEGATIVE -> {
rationaleCallbacks?.onRationaleDenied(model.code)
permissionCallbacks?.onPermissionsDenied(model.code, model.perms.toList())
}
}
}
}
如何使用
//把默認(rèn)使用方式:EasyPermissions.requestPermissions(this,request)沟沙,換成下面這個
ActivityPermissionsHelper.newInstance(this).requestPermissions(request)
//完整的調(diào)用方式
@AfterPermissionGranted(CODE_PERMISSION_REQUEST)
private fun requestPermissions() {
if (EasyPermissions.hasPermissions(this, *perms)) {
//TODO 在這里處理你自己的業(yè)務(wù)
} else {
val request = PermissionRequest.Builder(this)
.code(CODE_PERMISSION_REQUEST)
.perms(perms)
.rationale("請授予權(quán)限")
.build()
// EasyPermissions.requestPermissions(this,request)
// 使用新增的類
ActivityPermissionsHelper.newInstance(this).requestPermissions(request)
}
}
override fun onPermissionsGranted(requestCode: Int, perms: List<String>) {
// 授權(quán)通過后的畴,沒有關(guān)閉彈窗,這里需要主動關(guān)閉一下彈窗
ActivityPermissionsHelper.newInstance(this).dismissDialog()
}
Tips:使用這個方式尝胆,要注意一下EasyPermissions.requestPermissions()方法里的 notifyAlreadyHasPermissions()方法,如果已有權(quán)限护桦,需要處理一下權(quán)限刷新問題含衔,可通過EasyPermissions.onRequestPermissionsResult()方法,主動處理一下。
簡單思路的說明:
代碼里通過EasyPermissions.requestPermissions方法贪染,發(fā)起權(quán)限請求缓呛,讓我們看看干了什么事
//默認(rèn)的使用方式
val request = PermissionRequest.Builder(this)
.code(CODE_PERMISSION_REQUEST)
.perms(perms)
.rationale("請授予權(quán)限")
.build()
EasyPermissions.requestPermissions(this,request)
//EasyPermissions.requestPermissions 源碼
fun requestPermissions(
host: Activity,
request: PermissionRequest
) {
// Check for permissions before dispatching the request
if (hasPermissions(host, *request.perms)) {
notifyAlreadyHasPermissions(host, request.code, request.perms)
} else {
PermissionsHelper.newInstance(host).requestPermissions(request)
}
}
這里我們只要關(guān)注這個一句代碼 PermissionsHelper.newInstance(host).requestPermissions(request),這才是真正發(fā)起請求杭隙,觸發(fā)彈窗的哟绊,所以我們重寫這個類,照樣畫葫蘆就可以實現(xiàn)了