Jetpack Compose 动态权限申请(Permission Request)

搞定在Jetpack Compose中优雅地申请运行时权限 学习Jetpack Compose的平台运行时权限处理流程和方法,一文带你搞定用优雅的姿式申请运行时权限。 阅读详情

在 Jetpack Compose 动态申请权限可以使用两种方法

接下来分贝展示一下两种用法

  • 代码环境如下:
    • Kotlin 1.5.2
    • Jetpack Compose 1.0.2
    • Android Studio Chipmunk | 2021.2.1

要使用 Accompanist 需要额外引入

dependencies {
	...
    implementation "com.google.accompanist:accompanist-permissions:0.16.1"
	...
}

1. rememberLauncherForActivityResult 方式

rememberLauncherForActivityResult 是基于 Activity 的 ResultAPI 获取动态权限。例如我们可以在新打开一个 Activity 时通过这种方式获取权限:

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            RequestPermission()
        }
    }
}

@Composable
private fun RequestPermission() {
    // 基于 LocalComposition 获取 Context
    val context = LocalContext.current

    // 基于 LocalLifecycleOwner 获取 Lifecycle
    val lifecycle = LocalLifecycleOwner.current.lifecycle

    // 定义需要动态获取的 Permission 类型
    val permission = Manifest.permission.READ_EXTERNAL_STORAGE

    // Result API 调用时的 launcher
    val launcher = rememberLauncherForActivityResult(
        contract = ActivityResultContracts.RequestPermission(),
        onResult = { isGranted -> 
        	//判断权限申请结果,并根据结果侠士不同画面,由于 onResult 不是一个 @Composable lambda,所以不能直接显示 Composalbe 需要通过修改 state 等方式间接显示 Composable
        }
    )

    // 在 Activity onStart 时,发起权限事情,如果权限已经获得则跳过
    val lifecycleObserver = remember {
        LifecycleEventObserver { _, event ->
            if (event == Lifecycle.Event.ON_START) {
                if (!permission.isGrantedPermission(context)) {
                    launcher.launch(permission)
                }
            }
        }
    }

    // 当 Lifecycle 或者 LifecycleObserver 变化时注册回调,注意 onDispose 中的注销处理避免泄露
      DisposableEffect(lifecycle, lifecycleObserver) {
        lifecycle.addObserver(lifecycleObserver)
        onDispose {
            lifecycle.removeObserver(lifecycleObserver)
        }
    }
}

private fun String.isGrantedPermission(context: Context): Boolean {
    // 判断是否已经后的状态
    return context.checkSelfPermission(this) == PackageManager.PERMISSION_GRANTED
}

当进入 MainActivity 时请求权限的效果
在这里插入图片描述

2. Accompanist Permissions方式

Accompanist Permission 将权限申请结果以一个 Composable State 的形式返回,调用形式相较于第一种更加易用 。比如,我们通过该点击按钮动态申请权限

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            RequestPermissionUsingAccompanist()
        }
    }
}

@OptIn(ExperimentalPermissionsApi::class)
@Composable
private fun RequestPermissionUsingAccompanist() {
    val permission = Manifest.permission.READ_EXTERNAL_STORAGE

    // 定义 Permission State
    val permissionState = rememberPermissionState(permission)
    PermissionRequired(
        permissionState = permissionState,
        permissionNotAvailableContent = {
            // 权限获取失败
            Text("Permission Denied.")
        }, permissionNotGrantedContent = {
            // 尚未获取权限时
            Button(onClick = { permissionState.launchPermissionRequest() }) {
                Text("Request permission.")
            }
        }, content = {
            // 权限获取成功
            Text("Permission Granted.")
        }
    )
}

代码非常清晰,PermissionRequired 接收几个 Composable lambda 的参数,分别对应权限申请后,不同处理下的回调:

  • permissionNotGrantedContent:尚未获取权限或者获取失败(点击【Deny】)
  • permissionNotAvailableContent:点击【Deny & don’t ask again】时
  • content : 获取成功(点击【Allow】)

在这里插入图片描述
在这里插入图片描述

基于Kotlin与Jetpack Compose的现代化Android管理器开发实践 在Android应用开发领域,高效的文件与应用管理是提升用户体验的关键环节。其核心原理在于通过系统API安全地访问存储空间与应用数据,同时利用现代UI框架构建直观的交互界面。这项技术的价值在于能够为开发者提供一个纯净、可学习的工程实践范例,并为用户带来无广告、高透明度的管理工具。典型的应用场景包括批量清理应用缓存、可视化分析存储空间、以及安全便捷地管理手机文件。本文聚焦于运用Kotlin协程处理异步IO,并结合Jetpack Compose这一声明式UI框架,详细阐述了如何从零构建一个功能实用、代码开源、体 阅读详情

相关推荐

Android开源项目实战指南:从Jetpack到架构设计

Android开源生态是现代移动开发的核心支撑体系,其技术架构遵循分层设计原则。从底层的AOSP系统修改,到上层的Jetpack组件库,开发者可以通过模块化方案构建健壮应用。关键技术如Room数据库通过编译时SQL校验提升稳定性,WorkManager则解决了后台任务调度的痛点。在UI层,Lottie动画库实现了矢量动画的高性能渲染,而MVVM架构模式配合LiveData形成了响应式开发范式。这些技术在电商应用、社交软件等高频场景中验证了其工程价值,特别是模块化设计和动态功能加载,能够有效支撑大型项目的迭代

weixin_34150830的博客 348

十四、使用Jetpack Compsoe编写一个写小说的Android应用:动态权限申请(Android 13)导出功能实现

动态权限申请,导出小说功能实现

ncm1584716的博客 1510

Android 17权限适配与运行时权限管理实践

Android运行时权限模型是保障用户隐私安全的核心机制,从Android 6.0引入至今持续演进。其技术原理在于将危险权限的授予时机从安装时延迟到运行时,通过动态请求流程让用户掌握控制权。最新Android 17版本进一步扩展了需要运行时请求的权限范围,涉及精确定位、蓝牙扫描等高频使用场景。开发者需要掌握权限分级请求策略和Jetpack权限库的使用技巧,特别是在Compose等现代UI框架中的集成方案。针对健康监测类应用涉及的后台传感器权限,以及媒体管理应用需要的细分存储权限,都需要遵循新的请求时序规范。

weixin_29164185的博客 130

Android Jetpack Compose 底部弹窗,拍照,选择文件

Android Jetpack Compose 底部弹窗,拍照,选择文件

fanketly的博客 3309

从零打造可落地的直流电机 PID 驱动系统(四):Android 蓝牙控制 APP 开发(新手友好版)

本文介绍了如何基于Android开发一款直流电机控制APP,通过蓝牙与STM32硬件系统通信。主要内容包括:1. 使用Kotlin和Jetpack Compose开发Android应用;2. 实现蓝牙连接管理类,支持设备扫描、连接和数据传输;3. 设计电机控制界面,包含转速显示、速度调节、PID参数修改等功能;4. 详细说明权限配置、通信协议适配等关键实现细节;5. 提供完整的测试步骤和常见问题解决方案。该APP可实现对电机的无线控制,包括启停、调速和PID参数调整,代码结构清晰,适合二次开发。

weixin_44520581的博客 445

Android---教你如何开发扫二维码功能,终局之战

由于文章篇幅原因,我只把面试题列了出来,详细的答案,我整理成了一份PDF文档,这份文档还包括了还有高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 ,帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习。我整理成了一份PDF文档,这份文档还包括了还有高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 ,帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习。本文已被。

m0_60635321的博客 1410

rememberLauncherForActivityResult使用示例

需求需要跳转到 CoursexxxActivity ,选择课程,选中课程后,会将课程对象放到返回的intent中。需要先定义ManagedActivityResultLauncher。那么如何启动这个Activity,并且获取返回的课程内容内。然后在需要启动跳转的时候。怎么启动intent呢。

github_35581409的博客 421

Android Jetpack 权限管理

在 Android 应用开发中,权限管理是一项重要的任务,用于控制应用的访问权限,以保护用户的隐私和数据安全。在 Android 中,权限分为两类:正常权限和危险权限。而危险权限是指可能访问用户敏感信息或执行敏感操作的权限,应用需要在运行时动态请求用户授权。请注意,在开发应用时,需要在 AndroidManifest.xml 文件中声明所需的权限,并在运行时请求危险权限。此外,还应该处理权限被拒绝的情况,并向用户解释为什么需要该权限以及如何手动授予权限。它简化了权限请求的过程,并自动处理权限回调。

UoJava的博客 229

让Activity更加优雅地跳转

学习使用Activity Result API以让Activity的跳转变得更加的优雅,以及在Compose中直接处理Activity的跳转变得可能。

稀有猿诉 1217

保姆级避坑指南:Mid-360雷达到手后,用livox_ros_driver2从接线到出点云的完整流程

本文提供Mid-360雷达到手后的完整使用指南,涵盖从硬件接线、网络配置到livox_ros_driver2驱动的安装与调试,帮助用户避开常见陷阱,实现点云数据的稳定输出与可视化。重点解析了配置文件的参数设置和点云格式选择,确保用户能够高效部署和使用Mid-360雷达。

weixin_30733003的博客 481

Hifiasm参数调优实战:当N50不理想时的7个排查方向与解决方案

本文详细解析了Hifiasm参数调优实战,针对基因组组装中N50不理想的7个排查方向与解决方案。通过调整--hom-cov、-D、-N等核心参数,结合HiFi数据和参考基因组分析,有效提升组装质量。文章以猪毛菜基因组为例,展示了从2.1MB到4.3MB的N50优化过程,为生物信息学研究者提供实用指南。

weixin_30642561的博客 422

告别回调地狱:RxPermissions与Jetpack Compose的声明式权限请求实践

你是否还在为Android运行时权限(Runtime Permissions)的复杂回调逻辑而烦恼?是否在处理权限请求时陷入嵌套回调的迷宫?本文将带你探索如何使用RxPermissions库结合Jetpack Compose的声明式UI范式,以优雅简洁的方式解决Android权限管理问题。读完本文,你将掌握: - RxPermissions的核心优势与基础用法 - 如何在Jetpack Compo...

gitblog_01091的博客 536

元数据及数据仓库相关概念

文章目录元数据(metadata)的概念Data about Data定义技术元数据业务元数据总结数据仓库ODS简单的理解为 Operational Data Store, 运营数据仓储 数据整合层(也叫做数据缓冲层)EDW简单理解为 Enterprise Data Warehouse, 企业数据仓库ODS与EDW之间的差异使用角色数据来源数据获取性能和及时性数据架构数据共享能力数据系统提供应用数...

frone的专栏 3132

Android 中的权限申请

以申请位置权限为例。通常,如果应用需要获取精确位置,则请求,但有些应用可能只需要大致位置,那么可以只请求。</</

xingyu19911016的博客 643

数分实战(01):Global_Superstore数据集解析与商业洞察

本文以Global_Superstore零售数据集为例,手把手指导数据分析实战全流程。从数据清洗、探索性分析到深度商业洞察,详细解析了如何通过Python处理缺失值与异常值,进行销售利润分析、客户细分与地理分析,并探讨了折扣与利润的微妙关系。文章旨在帮助读者建立数据分析思维框架,从数据中挖掘可指导实际业务决策的核心洞察。

weixin_28487433的博客 332

【2025最新版】间接平差——以水准网平差为例 (python详细过程版)

水准网间接平差的python代码实现。博客长期更新,本文最新更新时间为:2025年5月20日。

点云侠的博客 1689

Mermaid Live Editor:在线实时图表编辑的终极免费解决方案

你是否曾经为制作技术文档中的流程图、时序图而头疼?是否厌倦了在复杂的绘图工具中反复调整格式?Mermaid Live Editor正是为解决这些问题而生的在线实时图表编辑器。作为Mermaid.js的官方在线版本,这个工具彻底改变了创建技术文档和可视化图表的方式,让任何人都能轻松绘制专业级图表。无论你是开发人员、产品经理还是技术文档作者,Mermaid Live Editor都能为你提供简单高效的

gitblog_01114的博客 335

搞懂 SAPUI5 Fiori 应用的 OData 授权维护:从 IWSG、IWSV 到 S_SERVICE 的完整实践

本文探讨了SAP Fiori项目中常见的授权问题及其解决方案。文章指出,开发人员常误将OData服务访问问题归咎于前端代码或配置,而实际上多因授权默认值未正确带入角色所致。详细分析了IWSG(前端服务组元数据)和IWSV(后端业务服务)两个关键对象的作用机制,强调应通过PFCG角色的Authorization Default入口维护服务对象,而非直接修改S_SERVICE授权对象。文章还提供了前后端授权配置的具体操作步骤,并特别提醒需同时配置前端和后端授权,才能确保应用完整可用性。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 196

零成本打造安卓AI提词器:Jetpack Compose与语音识别实战

在移动应用开发领域,Android平台凭借其开放性成为开发者实现创意的重要阵地。Jetpack Compose作为现代声明式UI工具包,通过简化界面构建流程,显著提升了开发效率。结合第三方AI服务,如语音识别技术,开发者能够为应用注入智能交互能力,创造更高价值。这类技术组合特别适用于内容创作工具的开发,例如实现一个集文本滚动与实时语音转字幕于一体的智能提词器应用。通过集成百度语音识别等AI服务,应用可具备语音识别实时转字幕和智能语速匹配等进阶特性,满足视频创作、知识分享等场景中对高效、智能提词工具的需求。

weixin_33884611的博客 442

「JS逆向三百例」JS逆向HIKVISION-视频监控的前端密码加密

本文详细分析了HIKVISION-海康威视监控前端登录过程中密码的加密机制,通过逆向工程解析了其 JavaScript 加密逻辑,重点研究了HIKVISION-海康威视监控的前端密码SHA256加密算法的实现。基于逆向分析结果,使用 Python 模拟了HIKVISION-海康威视监控的登录流程,最终实现了自动化登录功能。本文旨在为安全研究人员提供技术参考,帮助理解前端加密机制,并强调技术研究的合法性和合规性。

布啦啦 1092

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

权限被拒怎么办?,一文掌握Kotlin优雅处理用户拒绝策略

掌握Kotlin权限管理技巧,轻松应对用户拒绝场景。本文详解动态权限申请、拒绝后引导及 rationale 提示框使用,提升应用兼容性与用户体验。适用于Android开发中的敏感权限处理,值得收藏。

IterLoom的博客 449

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Android权限管理实战指南:XXPermissions框架深度解析与高效应用

在Android开发中,你是否曾为复杂的权限请求逻辑而头疼?面对Android 16+的版本适配、各种特殊权限的差异化处理,以及用户拒绝后的引导跳转,权限管理往往成为开发过程中的痛点。XXPermissions框架正是为解决这些问题而生,它是一个全面适配Android 16+的权限请求框架,能够统一处理普通权限、危险权限和特殊权限,让开发者专注于业务逻辑而非权限管理细节。 ## 场景化问题与解决

gitblog_00014的博客 344

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

ViMusic 项目常见问题解决方案

ViMusic 是一个用于从 YouTube Music 流式传输音乐的 Android 应用程序。该项目的主要编程语言是 Kotlin,并且使用了 Jetpack Compose 进行 UI 开发。ViMusic 提供了丰富的功能,包括播放几乎任何 YouTube Music 上的歌曲或视频、后台播放、缓存音频片段以供离线播放、搜索歌曲、专辑、艺术家、视频和播放列表、书签艺术家和专辑、导入播放列...

gitblog_00462的博客 849

Android开发环境搭建与基础开发指南

Android开发环境搭建是移动应用开发的第一步,核心工具Android Studio提供了完整的开发工具链。集成开发环境(IDE)通过SDK管理、代码编辑和调试工具,大幅提升开发效率。在配置环境时,需要关注Java版本兼容性、SDK组件完整性以及网络连接稳定性等关键因素。掌握Activity生命周期、Intent通信等基础组件,是构建Android应用的技术基石。随着Jetpack组件库的普及,MVVM架构模式已成为现代Android开发的标准实践,配合Kotlin协程可有效管理异步任务。从权限管理到后台

weixin_30420305的博客 384

Android开源项目精选:提升开发效率的实用指南

Android开源项目(AOSP)是移动开发领域的核心资源,通过复用成熟方案可显著提升开发效率。现代Android开发中,架构组件如Jetpack通过生命周期感知和类型安全设计解决了内存管理和数据持久化等基础问题,而Retrofit+OkHttp组合则为网络通信提供了标准化解决方案。在UI层面,Jetpack Compose采用声明式编程范式,大幅简化界面开发流程。性能优化工具如LeakCanary能有效检测内存泄漏,App Startup则优化了启动时序。这些经过生产验证的开源项目覆盖了从基础框架到前沿技

weixin_30565327的博客 275
上一篇: @OnLifecycleEvent 遭废弃,推荐使用 DefaultLifecycleObserver 替代
下一篇: Kotlin 1.6 正式发布,都有哪些新特性?
fundroid
fundroid 《Jetpack Compose从入门到实战》作者 《Jetpack Compose从入门到实战》作者 领域专家: 移动开发技术领域 领域专家: 移动开发技术领域
博客等级 码龄16年 2919粉丝 470原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fundroid

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值