当前位置:   article > 正文

Android registerForActivityResult

android registerforactivityresult

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

  1. // Activity 的 onCreate 方法中调用 registerForActivityResult
  2. val activityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { activityResult ->
  3. if(activityResult.resultCode == RESULT_OK) {
  4. val data = activityResult.data
  5. }
  6. }
  7. //发起请求
  8. activityResultLauncher.launch(intent)

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

  1. val activityResultLauncher = registerForActivityResult(ActivityResultContracts.OpenDocument()) {
  2. it?.let { uri ->
  3. DocumentFile.fromSingleUri(this, uri)?.let { documentFile ->
  4. println("file type: " + documentFile.type)
  5. println("file name: " + documentFile.name)
  6. Scanner(contentResolver.openInputStream(documentFile.uri)).use { reader ->
  7. var line: String
  8. while (reader.hasNextLine()) {
  9. line = reader.nextLine()
  10. println(line)
  11. }
  12. }
  13. }
  14. }
  15. }
  16. // 数组类型的参数是 MIME,如果不确定文件类型,就先设置所有类型,即 */*,之后通过 documentFile.type 查看
  17. activityResultLauncher.launch(arrayOf("*/*"))

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

implementation "androidx.documentfile:documentfile:1.0.1"
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/231708
推荐阅读
相关标签
  

闽ICP备14008679号