Android 权限辅助函数

Android Permissions Helper Functions

我有一个 activity 需要相机许可。

此 activity 可以从应用程序中的多个用户可配置位置调用。

基本原理对话框和权限对话框本身应在 activity 打开之前显示。

现在我正在尝试用某种扩展函数处理这些对话框。

fun handlePermissions(context: Context, required_permissions: Array<String>, activity: FragmentActivity?, fragment: Fragment?): Boolean {
    var isGranted = allPermissionsGranted(context, required_permissions)
    if (!isGranted) {
        //null here is where I used to pass my listener which was the calling fragment previously that implemented an interface
        val dialog = DialogPermissionFragment(null, DialogPermissionFragment.PermissionType.QR)


        activity?.supportFragmentManager?.let { dialog.show(it, "") }

        //get result from dialog? how?

        //if accepted launch actual permission request
        fragment?.registerForActivityResult(ActivityResultContracts.RequestPermission()) { success ->
            isGranted = success
        }?.launch(android.Manifest.permission.CAMERA)
    }
    return isGranted
}

但是我无法从 rationale/explanation 对话框中获取对话框结果。

到目前为止,我的研究使我可能使用高阶函数,将函数变量传递给对话片段,returns 将布尔值传递给辅助函数。但我完全不确定那是否正确。

我认为使用我自己的代码会更干净且开销更少,使用像 eazy-permissions 这样的框架时我可以更轻松地实现这一点吗? (Dexter 是否仍然值得推荐,因为它不再处于开发阶段)

这甚至是我想要在这里实现的可行的事情吗?

我已经实施并且似乎可行的一种方法是:

Class PermissionsHelper

class PermissionsHelper(private val activity: Activity) {

fun requestPermissionsFromDevice(
    arrayPermissions: Array<String>, permissionsResultInterface: PermissionsResultInterface
) {
    setPermissionResultInterface(permissionsResultInterface)
    getMyPermissionRequestActivity().launch(arrayPermissions)
}

fun checkPermissionsFromDevice(permission: String): Boolean {
    return ContextCompat.checkSelfPermission(activity, permission) ==
            PackageManager.PERMISSION_GRANTED
}

}

Class PermissionsResultInterface 给助手 class 可以与 activity.

进行通信
interface PermissionsResultInterface {
    fun onPermissionFinishResult(permissions: MutableMap<String, Boolean>)
}

使用此方法从应用程序目录中删除所有文件:

private fun clearFiles(firstCall: Boolean = false) {
    if (verifyStoragePermissions(firstCall)) {
        val dir = File(getExternalFilesDir(null).toString())
        removeFileOrDirectory(dir)
        Toast.makeText(
            applicationContext,
            resources.getString(R.string.done),
            Toast.LENGTH_SHORT
        ).show()
    }
}

private fun verifyStoragePermissions(firstCall: Boolean = false): Boolean {
    val arrayListPermissions = arrayOf(
        android.Manifest.permission.READ_EXTERNAL_STORAGE,
        android.Manifest.permission.WRITE_EXTERNAL_STORAGE
    )
    for (permission in arrayListPermissions) {
        if (!PermissionsHelper(this).checkPermissionsFromDevice(permission)) {
            if (firstCall) PermissionsHelper(this)
                .requestPermissionsFromDevice(arrayListPermissions, this)
            else PermissionsDialogs(this).showPermissionsErrorDialog()
            return false
        }
    }
    return true
}

override fun onPermissionFinishResult(permissions: MutableMap<String, Boolean>) {
    clearFiles()
}

通过这种方法,您可以调用权限助手并使用结果界面,在用户回答每个问题后,决定您是否仍需要调用权限或向他显示对话框。

如果您需要任何帮助,请随时与我联系。