境 迁 2024-02-19 14:51 采纳率: 0%
浏览 3

android读取u盘

android11以上的设备怎么读取U盘获取到U盘里面所有文件的uri,u盘的格式为FAT32、EXFAT

  • 写回答

2条回答 默认 最新

  • GISer Liu 2024-02-19 15:03
    关注

    该回答引用自GPT-3.5,由博主GIS_Liu编写:

    针对Android 11及以上设备读取U盘并获取其中所有文件的URI,需要考虑到Android 10之后的存储权限变更以及Scoped Storage的实施。以下是解决思路和方案:

    解决思路:

    1. 请求存储权限:首先,需要请求存储权限,以便能够访问外部存储设备。

    2. 使用Storage Access Framework(SAF):Android 11之后,最佳实践是使用SAF来与外部存储进行交互,这样可以确保应用程序在Android系统的不同版本上都能够正常工作。

    3. 使用DocumentFile类:DocumentFile类是SAF的一部分,可以代表文件或目录,并提供了一种统一的方式来访问这些文件或目录。

    4. 过滤U盘设备:通过MediaStore API或者StorageManager API来识别U盘设备,并获取其根目录的URI。

    5. 遍历文件:使用递归算法遍历U盘设备中的所有文件和目录,并获取它们的URI。

    解决方案:

    1. 请求存储权限:

    // 在AndroidManifest.xml中添加权限声明
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    
    // 在运行时请求权限
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                REQUEST_STORAGE_PERMISSION);
    }
    

    2. 使用Storage Access Framework:

    // 打开SAF文件选择器
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
    startActivityForResult(intent, REQUEST_CODE_OPEN_DOCUMENT_TREE);
    

    3. 使用DocumentFile类:

    // 处理SAF返回的URI
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
        super.onActivityResult(requestCode, resultCode, resultData);
        if (requestCode == REQUEST_CODE_OPEN_DOCUMENT_TREE && resultCode == Activity.RESULT_OK) {
            Uri treeUri = resultData.getData();
            DocumentFile pickedDir = DocumentFile.fromTreeUri(this, treeUri);
            // 使用pickedDir来访问U盘中的文件和目录
            traverseDirectory(pickedDir);
        }
    }
    
    // 递归遍历文件和目录
    private void traverseDirectory(DocumentFile dir) {
        for (DocumentFile file : dir.listFiles()) {
            if (file.isDirectory()) {
                traverseDirectory(file);
            } else {
                // 处理文件,获取URI
                Uri fileUri = file.getUri();
                // 处理文件URI,例如显示文件名或进行其他操作
                Log.d(TAG, "File URI: " + fileUri.toString());
            }
        }
    }
    

    通过以上解决思路和方案,可以在Android 11及以上设备上读取U盘并获取其中所有文件的URI。

    img

    如果该回答解决了您的问题,请采纳!如果没有,请详述问题所在!

    评论

报告相同问题?

问题事件

  • 创建了问题 2月19日

悬赏问题

  • ¥15 系统 24h2 专业工作站版,浏览文件夹的图库,视频,图片之类的怎样删除?
  • ¥15 怎么把512还原为520格式
  • ¥15 MATLAB的动态模态分解出现错误,以CFX非定常模拟结果为快照
  • ¥15 求高通平台Softsim调试经验
  • ¥15 canal如何实现将mysql多张表(月表)采集入库到目标表中(一张表)?
  • ¥15 wpf ScrollViewer实现冻结左侧宽度w范围内的视图
  • ¥15 栅极驱动低侧烧毁MOSFET
  • ¥30 写segy数据时出错3
  • ¥100 linux下qt运行QCefView demo报错
  • ¥50 F1C100S下的红外解码IR_RX驱动问题