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的实施。以下是解决思路和方案:
解决思路:
请求存储权限:首先,需要请求存储权限,以便能够访问外部存储设备。
使用Storage Access Framework(SAF):Android 11之后,最佳实践是使用SAF来与外部存储进行交互,这样可以确保应用程序在Android系统的不同版本上都能够正常工作。
使用DocumentFile类:DocumentFile类是SAF的一部分,可以代表文件或目录,并提供了一种统一的方式来访问这些文件或目录。
过滤U盘设备:通过MediaStore API或者StorageManager API来识别U盘设备,并获取其根目录的URI。
遍历文件:使用递归算法遍历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。
如果该回答解决了您的问题,请采纳!如果没有,请详述问题所在!
解决 无用评论 打赏 举报
悬赏问题
- ¥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驱动问题