Android Studio中在Fragment内用Kotlin实现文件选择(startActivityForResult已废弃)
在Fragment中用Kotlin实现文件选择(替代废弃的startActivityForResult)
核心思路
当前Android官方已废弃startActivityForResult(),推荐使用registerForActivityResult()绑定Activity结果回调。在Fragment中直接注册对应的文件选择启动器,即可唤起系统文件选择器并处理返回结果。
步骤1:注册文件选择的ActivityResultLauncher
在Fragment中定义成员变量保存启动器,建议在onViewCreated()方法内完成注册:
class FilePickerFragment : Fragment() { // 声明文件选择启动器 private lateinit var filePickerLauncher: ActivityResultLauncher<String> override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 注册启动器,处理选择后的结果 filePickerLauncher = registerForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? -> uri?.let { // 处理选中的文件Uri,示例:显示Toast提示、获取文件流等 Toast.makeText(requireContext(), "选中文件Uri:$it", Toast.LENGTH_SHORT).show() // 如需读取文件内容,可直接通过ContentResolver获取流 val inputStream = requireContext().contentResolver.openInputStream(it) // 后续对流进行操作(如上传、解析) } ?: run { // 用户取消选择时的逻辑 Toast.makeText(requireContext(), "未选择任何文件", Toast.LENGTH_SHORT).show() } } // 绑定触发按钮的点击事件 view.findViewById<Button>(R.id.btn_pick_file).setOnClickListener { // 启动文件选择器 filePickerLauncher.launch("*/*") } } }
步骤2:触发文件选择
调用filePickerLauncher.launch(mimeType)唤起系统文件选择器,参数为MIME类型,常用选项:
- 选择任意文件:
"*/*" - 仅选择图片:
"image/*" - 仅选择PDF:
"application/pdf" - 仅选择文本文件:
"text/*"
关键说明
- 权限简化:使用
ActivityResultContracts.GetContent()调用系统文件选择器时,无需自行申请READ_EXTERNAL_STORAGE权限,系统会自动处理文件访问逻辑。 - Uri处理:返回的
Uri是内容提供者格式,而非直接的本地文件路径。推荐直接通过ContentResolver获取文件流操作,适配Android 10+的存储权限变更。 - 多选文件:如需支持多选,可改用
ActivityResultContracts.GetMultipleContents(),回调结果为List<Uri>。
内容的提问来源于stack exchange,提问作者Onur Ilgaz SAKIR
相关产品推荐
相关产品推荐

