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,指向用户选择的文件。

cpp 复制代码
package com.example.helloworld.file

import 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.R

class FileActivity: AppCompatActivity() {

    private val pickFileLauncher = registerForActivityResult(
        ActivityResultContracts.StartActivityForResult()
    ) { result ->
        if (result.resultCode == RESULT_OK && result.data != null) {
            val uri: Uri? = result.data?.data
            uri?.let {
                // 处理选择的文件 URI
                Toast.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/pdf
            type = "*/*"
        }
        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。
相关推荐
用户693717500138410 小时前
不卷AI速度,我卷自己的从容——北京程序员手记
android·前端·人工智能
程序员Android11 小时前
Android 刷新一帧流程trace拆解
android
墨狂之逸才11 小时前
解决 Android/Gradle 编译报错:Comparison method violates its general contract!
android
阿明的小蝴蝶12 小时前
记一次Gradle环境的编译问题与解决
android·前端·gradle
汪海游龙12 小时前
开源项目 Trending AI 招募 Google Play 内测人员(12 名)
android·github
qq_2837200513 小时前
MySQL技巧(四): EXPLAIN 关键参数详细解释
android·adb
没有了遇见14 小时前
Android 架构之网络框架多域名配置<三>
android
myloveasuka15 小时前
[Java]单列集合
android·java·开发语言
fundroid16 小时前
Room 3.0 完全解析:一次面向未来的现代化重构
android·数据库·database·kmp
漂洋过海来看你啊16 小时前
Jetpack Compose高效列表实战:状态管理与性能优化指南
android