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

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。
http://www.xdnf.cn/news/6565.html

相关文章:

  • 利用边缘计算和工业计算机实现智能视频分析
  • JAVAfx项目总结 算法题
  • 《AI大模型应知应会100篇》第65篇:基于大模型的文档问答系统实现
  • Linux 系统切换国内镜像源教程
  • ChatGPT到Claude全适配:跨模型Prompt高级设计规范与迁移技巧
  • 面向SDV的在环测试深度解析——仿真中间件SIL KIT应用篇
  • 职坐标AIoT技能培训课程实战解析
  • python报错:必须实现所有abstract方法原因及解决方案
  • 如何更改远程桌面连接的默认端口?附外网访问内网计算机方法
  • 数学复习笔记 13
  • polarctf-web-[rce1]
  • P1439 【模板】最长公共子序列
  • 第五部分:第五节 - Express 路由与中间件进阶:厨房的分工与异常处理
  • “多维像素”可赋能具身智能非凡感知力——昱感微参加2025松山湖中国IC创新高峰论坛
  • 2026《数据结构》考研复习笔记四(绪论)
  • [AI算法] LLM训练-构建transformers custom model
  • 安卓中0dp和match_parent区别
  • Verilog HDL 语言整理
  • Vue.js教学第二章:Vue实例创建与核心选项全解析
  • 「Mac畅玩AIGC与多模态40」开发篇35 - 用 Python 开发服务对接 SearxNG 与本地知识库
  • C++(16):“”符号
  • 【ARM】MDK如何将变量存储到指定内存地址
  • GESP2025年3月认证C++二级( 第三部分编程题(1)等差矩阵)
  • conda创建环境常用命令(个人用)
  • 优雅使用Gunicorn进程管理FastAPI
  • 硬件厂商的MIB文档详解 | 如何查询OID? | MIB Browser实战指南-优雅草卓伊凡
  • 基于MATLAB-GUI图形界面的数字图像处理
  • 深入理解For循环及相关关键字原理:以Python和C语言为例
  • uni-app x正式支持鸿蒙原生应用开发
  • LeetCode Hot100刷题——合并区间