如何访问连接的 USB 闪存驱动器上的文件 [Android 12]

问题描述 投票:0回答:2

我正在尝试从连接的 USB 闪存驱动器读取文件,我已经搜索了无数 Stackoverflow 问题,但没有任何效果。

我能够检测到 USB 已连接,并且我知道 USB 安装在

/mnt/media_rw/

我可以使用 StorageManager 获取此路径,但系统拒绝我的应用程序读取该路径下任何文件的权限,即使将所有所需的权限添加到清单后也是如此

<uses-permission android:name="android.permission.USB_PERMISSION" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

根据文档“MANAGE_EXTERNAL_STORAGE”权限应该允许我访问存储设备上的所有文件:

MANAGE_EXTERNAL_STORAGE 权限授予以下内容: 对共享存储中的所有文件进行读写访问。 访问 MediaStore.Files 表的内容。

访问 USB OTG 驱动器和 SD 卡的根目录。

对所有内部存储目录的写访问权限,除了 /Android/data/、/sdcard/Android 和 /sdcard/Android 的大多数子目录。此写入访问包括直接文件路径访问。

https://developer.android.com/training/data-storage/manage-all-files

我的问题很简单,我想要的只是一种从连接的 USB 闪存驱动器读取文件的方法

android kotlin storage usb-drive
2个回答
0
投票

您应该让用户使用

ACTION_OPEN_DOCUMENT_TREE
选择 USB 驱动器。

之后您可以浏览整个驱动器并访问所有文件。


0
投票

我没有较新的设备,并且 Android 模拟器没有提供模拟 USB 存储的简单方法,因此我使用两台 Android 11 设备和一台安装 Android 8 的旧设备进行了一些测试。结果:不幸的是,USB 存储通常不可用通过标准文件系统可用。相反,谷歌显然强迫您使用其专有的存储访问框架(如blackapps的答案中提到的)。请注意,与标准文件操作相比,SAF 提供的加速系数约为 1/100,并且根本不适用于本机代码(C/C++/汇编器)。

特别是我的 LG Android 11 设备确实通过 /storage/XXXX-XXXX 提供文件访问。 三星设备。 Android 8 设备也没有。如果您想自行测试,请运行“adb shell”或在您的设备上运行 Termux 并执行“mount”命令。 Grep“/storage/”以查看哪些大容量存储可用。如果您有 SD 卡,您应该会看到“/storage/emulated/0”表示内部存储器,而“/storage/YYYY-YYYY”表示您的 SD 卡。如果还有一个“/storage/XXXX-XXXX”,这就是你的OTG内存。也许你必须避开三星。我鼓励每个人在自己的设备上测试此功能。

© www.soinside.com 2019 - 2024. All rights reserved.