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。
相关推荐
又见情义12 小时前
Android 13 Settings 设置界面选项裁剪(RK3568平台)
android
人才瘾大13 小时前
Android录屏内部音频录制完全指南:原理、限制与方案选型
android·音视频
网安蟹佬霸13 小时前
Webshell免杀与检测实战:从一句话木马到加密流量
android·安全·web安全·网络安全·黑客·网安·渗透测试·
阿巴斯甜16 小时前
Android SharedMemory 详细使用
android
sun00770016 小时前
android的dns的常见错误resolv
android
恋猫de小郭17 小时前
Flutter A2UI 的正确用法,怎么把 AI 和动态 UI 结合有效生产
android·前端·flutter
余额瞒着我当琳17 小时前
C++--vector第二讲:手写 C++ STL:vector 源码剖析与迭代器失效分析
android·java·c++
程序员-珍17 小时前
安卓开发:同名 styles.xml 在不同分支/文件夹的合并规则
android·xml·前端
我命由我1234517 小时前
Compose Codelab 学习 - Compose 中的基本布局
android·java·java-ee·kotlin·android studio·android-studio·android runtime
ii_best17 小时前
手机自动化脚本按键精灵实战:随机布局安全数字键盘的自动化输入方案
android·运维·ios·自动化·手机