赞
踩
startActivityForResult 已经被标记为不推荐的方法,推荐的替代方案是使用 registerForActivityResult:
- // 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(),代码如下:
- 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类型、文件名字、文件大小等,需要添加依赖:
implementation "androidx.documentfile:documentfile:1.0.1"
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。