我们正在为安卓电视盒开发应用程序。如何获取已挂载的外部存储设备列表,例如USB闪存驱动器、SD卡和SATA硬盘
?
我们正在为安卓电视盒开发应用程序。如何获取已挂载的外部存储设备列表,例如USB闪存驱动器、SD卡和SATA硬盘
?
我使用 /proc/mounts 文件获取可用存储选项列表。
public class StorageUtils {
private static final String TAG = "StorageUtils";
public static class StorageInfo {
public final String path;
public final boolean readonly;
public final boolean removable;
public final int number;
StorageInfo(String path, boolean readonly, boolean removable, int number) {
this.path = path;
this.readonly = readonly;
this.removable = removable;
this.number = number;
}
public String getDisplayName() {
StringBuilder res = new StringBuilder();
if (!removable) {
res.append("Internal SD card");
} else if (number > 1) {
res.append("SD card " + number);
} else {
res.append("SD card");
}
if (readonly) {
res.append(" (Read only)");
}
return res.toString();
}
}
public static List<StorageInfo> getStorageList() {
List<StorageInfo> list = new ArrayList<StorageInfo>();
String def_path = Environment.getExternalStorageDirectory().getPath();
boolean def_path_removable = Environment.isExternalStorageRemovable();
String def_path_state = Environment.getExternalStorageState();
boolean def_path_available = def_path_state.equals(Environment.MEDIA_MOUNTED)
|| def_path_state.equals(Environment.MEDIA_MOUNTED_READ_ONLY);
boolean def_path_readonly = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED_READ_ONLY);
HashSet<String> paths = new HashSet<String>();
int cur_removable_number = 1;
if (def_path_available) {
paths.add(def_path);
list.add(0, new StorageInfo(def_path, def_path_readonly, def_path_removable, def_path_removable ? cur_removable_number++ : -1));
}
BufferedReader buf_reader = null;
try {
buf_reader = new BufferedReader(new FileReader("/proc/mounts"));
String line;
Log.d(TAG, "/proc/mounts");
while ((line = buf_reader.readLine()) != null) {
Log.d(TAG, line);
if (line.contains("vfat") || line.contains("/mnt")) {
StringTokenizer tokens = new StringTokenizer(line, " ");
String unused = tokens.nextToken(); //device
String mount_point = tokens.nextToken(); //mount point
if (paths.contains(mount_point)) {
continue;
}
unused = tokens.nextToken(); //file system
List<String> flags = Arrays.asList(tokens.nextToken().split(",")); //flags
boolean readonly = flags.contains("ro");
if (line.contains("/dev/block/vold")) {
if (!line.contains("/mnt/secure")
&& !line.contains("/mnt/asec")
&& !line.contains("/mnt/obb")
&& !line.contains("/dev/mapper")
&& !line.contains("tmpfs")) {
paths.add(mount_point);
list.add(new StorageInfo(mount_point, readonly, true, cur_removable_number++));
}
}
}
}
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
} finally {
if (buf_reader != null) {
try {
buf_reader.close();
} catch (IOException ex) {}
}
}
return list;
}
}
要获取所有可用的外部存储文件夹(包括SD卡),您可以使用以下代码:
File[] externalStorageFiles=ContextCompat.getExternalFilesDirs(this,null);
如果你想要前往每个外部存储的“根目录”(即真正的挂载文件夹路径),你可以使用我写的这个函数:
/** Given any file/folder inside an sd card, this will return the path of the sd card */
private static String getRootOfInnerSdCardFolder(File file)
{
if(file==null)
return null;
final long totalSpace=file.getTotalSpace();
while(true)
{
final File parentFile=file.getParentFile();
if(parentFile==null||parentFile.getTotalSpace()!=totalSpace)
return file.getAbsolutePath();
file=parentFile;
}
}
Environment.getExternalStorageState()
返回内部SD卡挂载点的路径,例如“/mnt/sdcard”。
不,Environment.getExternalStorageDirectory()
指的是设备制造商认为的“外部存储”。在某些设备上,这是可移动介质,如SD卡。在一些设备上,这是设备闪存的一部分。在这里,“外部存储”指的是“通过USB大容量存储模式访问的内容,当它们被安装在主机上时”,至少对于Android 1.x和2.x。
但问题是关于外部SD卡的。如何获得类似“/mnt/sdcard/external_sd”的路径(它可能因设备而异)?
除了上述的外部存储,Android没有“外部SD卡”的概念。
如果设备制造商选择将外部存储设置为内置闪存,并且又有SD卡,则需要联系该制造商,以确定是否可以使用SD卡(不能保证),以及使用它的规则,例如要使用哪个路径。
试试这个:
manifest.xml:
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="android.intent.action.ums_connected" />
</intent-filter>
</receiver>
我的接收器:
public class MyReceiver extends BroadcastReceiver{
if (intent.getAction().equalsIgnoreCase(
"android.intent.action.UMS_CONNECTED")) {...}
}
另一个选择。
首先获取所有外部文件目录。
File[] externalStorageFiles=ContextCompat.getExternalFilesDirs(this,null);
private static String getRootOfExternalStorage(File file)
{
if (file == null)
return null;
String path = file.getAbsolutePath();
return path.replaceAll("/Android/data/" + getPackageName() + "/files", "");
}
您可以使用 getExternalStorageDirectory()
来获取外部存储目录。文档对其用法有很好的解释 http://developer.android.com/reference/android/os/Environment.html#getExternalStorageDirectory%28%29
对于 USB 设备,您可能需要查看 UsbManager
类或更一般地说是 android.hardware.usb
http://developer.android.com/reference/android/hardware/usb/UsbManager.html
getExternalStorageDirectory()
不好用,因为它返回的是 sdcard0 - 这是内部存储。我使用的是三星 Galaxy Note 2。 - Peter我知道这个话题已经有些年头了,但这可能会有所帮助。你应该使用这种方法。
System.getenv();
请查看项目Environment3,以访问连接到您设备的所有存储。