Android registerForActivityResult

startActivityForResult 已经被标记为不推荐的方法,推荐的替代方案是使用 registerForActivityResult:

Kotlin 复制代码
// Activity 的 onCreate 方法中调用 registerForActivityResult
val activityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { activityResult ->  
    if(activityResult.resultCode == RESULT_OK) {
        val data = activityResult.data
    }
}

//发起请求
activityResultLauncher.launch(intent)

除了 ActivityResultContracts.StartActivityForResult(),ActivityResultContracts 还有很多针对特定功能的其他请求,如动态申请单个或多个权限、选择文件等,选择文件还可以细分为图片、音频、视频等,总之旧代码中使用 startActivityForResult() 的地方,都可以找到对应的替代方案,由于新系统出于对隐私的保护,APP要访问手机任意目录下的文件,需要获得特定的权限,Google Play已经明确,非文件管理器等特殊应用,一般不允许APP使用"访问所有文件"的权限,所以APP如果要存储文件,并且需要导出,基本都是存储在APP专用的目录(Android/data/<packagename>/files),如果需要访问外部存储的文件,比如升级文件等,就使用 ActivityResultContracts.OpenDocument(),代码如下:

Kotlin 复制代码
val activityResultLauncher = registerForActivityResult(ActivityResultContracts.OpenDocument()) {
    it?.let { uri ->
        DocumentFile.fromSingleUri(this, uri)?.let { documentFile ->
            println("file type: " + documentFile.type)
            println("file name: " + documentFile.name)
            Scanner(contentResolver.openInputStream(documentFile.uri)).use { reader ->
                var line: String
                while (reader.hasNextLine()) {
                    line = reader.nextLine()
                    println(line)
                }
            }
        }
    }
}

// 数组类型的参数是 MIME,如果不确定文件类型,就先设置所有类型,即 */*,之后通过 documentFile.type 查看
activityResultLauncher.launch(arrayOf("*/*"))

上面的代码用到了 DocumentFile,主要用来通过 Uri 获取文件信息,如MIME类型、文件名字、文件大小等,需要添加依赖:

Kotlin 复制代码
implementation "androidx.documentfile:documentfile:1.0.1"
相关推荐
Libraeking1 小时前
破壁行动:在旧项目中丝滑嵌入 Compose(混合开发实战)
android·经验分享·android jetpack
市场部需要一个软件开发岗位2 小时前
JAVA开发常见安全问题:Cookie 中明文存储用户名、密码
android·java·安全
JMchen1233 小时前
Android后台服务与网络保活:WorkManager的实战应用
android·java·网络·kotlin·php·android-studio
crmscs4 小时前
剪映永久解锁版/电脑版永久会员VIP/安卓SVIP手机永久版下载
android·智能手机·电脑
localbob4 小时前
杀戮尖塔 v6 MOD整合版(Slay the Spire)安卓+PC端免安装中文版分享 卡牌肉鸽神作!杀戮尖塔中文版,电脑和手机都能玩!杀戮尖塔.exe 杀戮尖塔.apk
android·杀戮尖塔apk·杀戮尖塔exe·游戏分享
机建狂魔4 小时前
手机秒变电影机:Blackmagic Camera + LUT滤镜包的专业级视频解决方案
android·拍照·摄影·lut滤镜·拍摄·摄像·录像
hudawei9964 小时前
flutter和Android动画的对比
android·flutter·动画
lxysbly6 小时前
md模拟器安卓版带金手指2026
android
儿歌八万首7 小时前
硬核春节:用 Compose 打造“赛博鞭炮”
android·kotlin·compose·春节
消失的旧时光-19439 小时前
从 Kotlin 到 Dart:为什么 sealed 是处理「多种返回结果」的最佳方式?
android·开发语言·flutter·架构·kotlin·sealed