当前位置: 首页 > news >正文

Android 中 打开文件选择器(ACTION_OPEN_DOCUMENT )

在 Android 中,打开文件选择器(File Picker)通常是指启动一个系统提供的界面,让用户可以选择存储在设备上的文件。可以通过发送一个带有 Intent.ACTION_OPEN_DOCUMENT 或 Intent.ACTION_GET_CONTENT 的 Intent 来实现。

1、启动文件选择器

Intent.ACTION_OPEN_DOCUMENT 和 Intent.ACTION_GET_CONTENT 都是一个系统提供的 Intent 动作,用于启动一个文件选择器,允许用户选择存储在设备上的文件。这个动作返回一个 Uri,指向用户选择的文件。

package com.example.helloworld.fileimport android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.widget.Button
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import com.example.helloworld.Rclass FileActivity: AppCompatActivity() {private val pickFileLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->if (result.resultCode == RESULT_OK && result.data != null) {val uri: Uri? = result.data?.datauri?.let {// 处理选择的文件 URIToast.makeText(this, "Selected file URI: $uri", Toast.LENGTH_SHORT).show()}} else {Toast.makeText(this, "No file selected", Toast.LENGTH_SHORT).show()}}override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_file)val button:Button = findViewById(R.id.file_packer)button.setOnClickListener {startFilePacker()}}/*** 启动文件选择器*/private fun startFilePacker() {val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {addCategory(Intent.CATEGORY_OPENABLE)// 允许选择所有类型的文件, 若为PDF文件,则类型为 application/pdftype = "*/*"}pickFileLauncher.launch(intent)}
}

2、权限说明

  • 如果你需要访问文件的内容,可能需要请求 READ_EXTERNAL_STORAGE 权限。
  • 从 Android 11 开始,WRITE_EXTERNAL_STORAGE 权限不再提供对所有文件的访问权限。
  • 从 Android 10 开始,应用需要遵循分区存储规则。使用 Intent.ACTION_OPEN_DOCUMENT 或 Intent.ACTION_GET_CONTENT 是符合分区存储的设计原则的。
  • 获取到的文件 URI 是一个 content:// URI,而不是文件路径。如果需要访问文件的路径,可以使用 ContentResolver。

相关文章:

  • 基于React的高德地图api教程005:圆形标记的绘制、删除、修改
  • 0-INViT:一个具有不变嵌套视图Transformer的可推广路由问题求解器(code)(未完)
  • GDB 高级调试技术深度解析
  • 【Python+flask+mysql】网易云数据可视化分析(全网首发)
  • STM32F103经SPI总线向写Micro SD卡
  • 怎么使用python进行PostgreSQL 数据库连接?
  • Web性能优化的未来:边缘计算、AI与新型渲染架构
  • WebMvcConfigurer介绍-笔记
  • 算法刷题(Java与Python)1.二分查找
  • 车道线检测----CLRERNet
  • 【云实验】基于对象存储OSS实现企业门户网站托管
  • RNope:结合 RoPE 和 NoPE 的长文本建模架构
  • 如何解决Move to iOS 不起作用的问题?
  • 车道线检测----CLRNet
  • C语言图案代码大全:从基础到高级
  • Recycling Krylov Subspace 方法解释与开源实现
  • ECMAScript标准:JavaScript的核心
  • 数据治理域——数据同步设计
  • python基础语法(三-中)
  • Jenkins 执行器(Executor)如何调整限制?
  • 试点首发进口消费品检验便利化措施,上海海关与上海商务委发文
  • 广西壮族自治区党委常委会:坚决拥护党中央对蓝天立进行审查调查的决定
  • 《日出》华丽的悲凉,何赛飞和赵文瑄演绎出来了
  • 人形机器人灵犀X2掌握新技能:有了“内心戏”,还会拳脚功夫
  • 人民日报整版聚焦:外贸产品拓内销提速增量,多地加快推动内外贸一体化
  • 联合国报告:全球经济前景恶化,面临高度不确定性