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()
}
通过这种方法,您可以调用权限助手并使用结果界面,在用户回答每个问题后,决定您是否仍需要调用权限或向他显示对话框。
如果您需要任何帮助,请随时与我联系。
我有一个 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()
}
通过这种方法,您可以调用权限助手并使用结果界面,在用户回答每个问题后,决定您是否仍需要调用权限或向他显示对话框。
如果您需要任何帮助,请随时与我联系。