当前位置: 首页 > wzjs >正文

上海做网站待遇沈阳市建设工程项目管理中心网站

上海做网站待遇,沈阳市建设工程项目管理中心网站,南京seo优化推广,小学英语教师做应用相关网站在 Android 开发中,权限管理是保证应用安全性和用户体验的重要环节。以下是基于 Kotlin 的权限管理封装最佳实践,采用现代 API 和简洁的代码结构: 一、基础封装思路 使用 Activity Result API(替代 onRequestPermissionsResult&a…

在 Android 开发中,权限管理是保证应用安全性和用户体验的重要环节。以下是基于 Kotlin 的权限管理封装最佳实践,采用现代 API 和简洁的代码结构:


一、基础封装思路

  1. 使用 Activity Result API(替代 onRequestPermissionsResult
  2. 结合 Kotlin 扩展函数和高阶函数简化调用
  3. 统一处理权限请求结果(包括拒绝/永久拒绝)
  4. 支持多权限请求和单权限请求

二、核心封装代码

// PermissionManager.kt
object PermissionManager {// region ========== Contracts ==========private val multiplePermissionsContract =ActivityResultContracts.RequestMultiplePermissions()private val singlePermissionContract =ActivityResultContracts.RequestPermission()// endregion// region ========== Result Types ==========sealed class PermissionResult {object Granted : PermissionResult()data class Denied(val permissions: List<String>) : PermissionResult()data class PermanentlyDenied(val permissions: List<String>) : PermissionResult()}// endregion// region ========== Public Methods ==========fun checkPermissions(lifecycleOwner: LifecycleOwner,registry: ActivityResultRegistry,permissions: List<String>,onResult: (PermissionResult) -> Unit) {when {// 已有全部权限permissions.all { isGranted(it) } -> {onResult(PermissionResult.Granted)}// 需要请求权限else -> launchPermissionRequest(lifecycleOwner,registry,permissions,onResult)}}// endregion// region ========== Private Methods ==========private fun launchPermissionRequest(lifecycleOwner: LifecycleOwner,registry: ActivityResultRegistry,permissions: List<String>,onResult: (PermissionResult) -> Unit) {val launcher = registry.register("permission_request_key",lifecycleOwner,if (permissions.size > 1) multiplePermissionsContractelse singlePermissionContract) { results ->handlePermissionResult(results, permissions, onResult)}launcher.launch(permissions.toTypedArray())}private fun handlePermissionResult(results: Map<String, Boolean>,requestedPermissions: List<String>,onResult: (PermissionResult) -> Unit) {val deniedPermissions = results.filter { !it.value }.keys.toList()val permanentlyDenied = deniedPermissions.filter { !shouldShowRequestPermissionRationale(it) }when {deniedPermissions.isEmpty() -> onResult(PermissionResult.Granted)permanentlyDenied.isNotEmpty() -> onResult(PermissionResult.PermanentlyDenied(permanentlyDenied))else -> onResult(PermissionResult.Denied(deniedPermissions))}}private fun isGranted(permission: String): Boolean {return ContextCompat.checkSelfPermission(ApplicationProvider.getApplicationContext(),permission) == PackageManager.PERMISSION_GRANTED}private fun shouldShowRequestPermissionRationale(permission: String): Boolean {val activity = getTopActivity() ?: return falsereturn ActivityCompat.shouldShowRequestPermissionRationale(activity, permission)}// endregion
}

三、使用扩展函数简化调用

// Activity/Fragment Extensions
fun Fragment.requestPermissions(permissions: List<String>,onResult: (PermissionManager.PermissionResult) -> Unit
) {PermissionManager.checkPermissions(viewLifecycleOwner,requireActivity().activityResultRegistry,permissions,onResult)
}fun Activity.requestPermissions(permissions: List<String>,onResult: (PermissionManager.PermissionResult) -> Unit
) {PermissionManager.checkPermissions(this,activityResultRegistry,permissions,onResult)
}

四、业务层调用示例

// 在 Activity/Fragment 中调用
requestPermissions(listOf(Manifest.permission.CAMERA,Manifest.permission.READ_EXTERNAL_STORAGE
)) { result ->when (result) {is PermissionManager.PermissionResult.Granted -> {// 权限已授予openCamera()}is PermissionManager.PermissionResult.Denied -> {// 部分权限被拒绝(非永久)showRationaleDialog()}is PermissionManager.PermissionResult.PermanentlyDenied -> {// 权限被永久拒绝showSettingsRedirectDialog()}}
}

五、最佳实践要点

  1. 分层处理逻辑

    • UI 层:处理弹窗提示和用户交互
    • 业务层:处理权限相关业务逻辑
    • 框架层:处理系统 API 交互
  2. Rationale 处理策略

private fun showRationaleDialog() {MaterialAlertDialogBuilder(requireContext()).setTitle("需要权限").setMessage("此功能需要相机和存储权限").setPositiveButton("去授权") { _, _ ->// 再次请求权限requestPermissions(permissionsList, callback)}.setNegativeButton("取消", null).show()
}
  1. 永久拒绝处理
private fun showSettingsRedirectDialog() {MaterialAlertDialogBuilder(requireContext()).setTitle("权限被永久拒绝").setMessage("请到设置中手动开启权限").setPositiveButton("去设置") { _, _ ->Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply {data = Uri.fromParts("package", requireContext().packageName, null)startActivity(this)}}.setNegativeButton("取消", null).show()
}

六、注意事项

  1. 清单声明:仍需在 AndroidManifest.xml 中声明权限
  2. 结果回调:通过 Activity Result API 自动处理生命周期
  3. 配置变化:系统自动处理屏幕旋转等配置变化
  4. 权限分组:实际仍需单独检查每个权限状态

通过这种封装方式,可以实现以下优势:

  • 类型安全的权限结果处理
  • 与生命周期自动绑定
  • 支持 Fragment 和 Activity 统一调用
  • 清晰的拒绝状态区分
  • 避免内存泄漏风险

建议根据项目需求进一步扩展功能(如日志记录、Analytics 埋点等)。

http://www.dtcms.com/wzjs/564664.html

相关文章:

  • 想把自己做的网站放到网上深圳商务网站建设
  • 镇江网站营销推广哪个软件制作视频比较好
  • 北海哪里做网站建设wordpress首页404
  • 贵州省住房与城乡建设厅门户网站校园招聘
  • 做酒店管理网站的作用北京建设网站的公司哪家好
  • 手机版的学习网站php婚庆网站
  • 网站空间的控制面板首页品牌名称怎么取
  • 做一个公司的网站应做哪些准备工作内容九江做网站的公司
  • 问答网站开发坪地网站建设效果
  • 做网站先付款seo网页优化公司
  • 五种常用的网站推广方法seo网络推广培训
  • 加猛挣钱免费做网站软件网站免费大全
  • 写作的网站有哪些客户关系管理系统的特点
  • 网站源码下载wordpress academy
  • 制作哪个网站好免费自助建站系统
  • 企业做网站的多吗贵阳网站关键字优化
  • 福州网站网页设计祁东县建设局网站
  • 台州网站建设方案优化《网站平台建设》课程实训
  • 网站改版htmlnodejs适合网站开发
  • 邹平做网站的公司有哪些商务网站开发的的基本流程
  • 特别酷炫网站怎么维护网站
  • 大连手机网站制作网站建设四网合一
  • 中国建设银行青海分行网站免费策划方案平台
  • 做货代用的网站哪里有做网站优化的公司
  • 凯里市住房和城乡建设局网站做期货到哪个网站看新闻
  • 做的网站怎样打开速度快企业网站的一般要素包括
  • wordpress pc站m站微信网站怎样做
  • 网站做301将重定向到新域名wordpress做线下交易
  • 网站开发平台目录自适应平台网站
  • 外贸网站建站系统wordpress样式丢失