鉴于File
或Uri
,我如何可靠地确定该文件是否位于连接到手机USB端口的USB大容量存储设备上?
我的测试手机,三星Galaxy S7 Edge,连接了USB大容量存储设备,内部(物理)微型SD卡和内部存储。当我查询Context.getExternalCacheDirs()
时,我看到了所有这三个:
/storage/emulated/0/Android/data/...
/storage/A2B3-15F3/Android/data/...
/storage/3535-3038/Android/data/...
如何确定哪一个是USB大容量存储设备? (顺便说一下,这是A2B3-15F3。)
我查看了this answer(StorageHelper.resolveType()
方法),但正如您所看到的,设备的挂载文件路径不包含字符串“usb”。
然后我尝试使用StorageManager
服务。使用上述设备,我们可以使用:
StorageManager storageManager = context.getSystemService(StorageManager.class);
StorageVolume volume = storageManager.getStorageVolume(context.getExternalCacheDirs()[1]);
这是事情有点奇怪的地方。安卓25源代码中的StorageVolume
API docs和我本地文件副本似乎对我没什么帮助,但是当我在Android Studio调试器中执行上述代码时,该对象包含mSubSystem
将上述三个设备分别描述为“fuse”,“usb”和“sd”的字段。这是一个例子:
为什么我在调试器中看到这些信息,而不是源代码?此字段是否特定于此特定手机的Android发行版?
答案 0 :(得分:0)
Environment.getExternalStorageDirectory()将返回SD卡挂载点的路径。 USB存储仅支持极少数设备(支持 USB主机模式进行外部存储的设备)。这将安装在/mnt
下的某个位置,但具体位置会有所不同。您需要使用Android NDK来查询和迭代已安装的设备以找到您之后的那个。在NDK和NDK下编写逻辑/mnt
内的查询是一条可靠的路线。
如果您真的想尝试java方面,请尝试以下代码,如果它适合您:
public String getUSBStoragepath() {
try {
Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec("mount");
InputStream input_stream = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(input_stream);
String line;
String[] paths_list = new String[10];
int i = 0;
int available = 0;
BufferedReader buffer_reader = new BufferedReader(isr);
while ((line = buffer_reader.readLine()) != null) {
String mount = new String();
if (line.contains("secure"))
continue;
if (line.contains("asec"))
continue;
if (line.contains("fat")) {// TF card
String columns[] = line.split(" ");
if (columns != null && columns.length > 1) {
mount = mount.concat(columns[1] + "/requiredfiles");
paths_list[i] = mount;
i++;
// check directory is exist or not
File dir = new File(mount);
if (dir.exists() && dir.isDirectory()) {
// do something here
available = 1;
final_path = mount;
break;
} else {
}
}
}
}
if (available == 1) {
} else if (available == 0) {
final_path = paths_list[0];
}
} catch (Exception e) {
}
return final_path;
}
然后,您需要在最终路径中查询是否存在相关文件,以确定给定文件是否为USB格式。 < / p>
答案 1 :(得分:0)
您可以通过USBManager,连接的USB设备列表检查USB大容量存储是否已连接到手机,然后检查USB接口是否为USB_CLASS_MASS_STORAGE类。 然后询问用户是否断开USB大容量存储,保存SD卡路径并要求用户重新连接USB。其余的dirs将是USB路径。