我有一个在外部SD卡上执行写操作的应用程序(在外部,不是在设备的闪存中的“外部”),但是由于已经对here和其他一些问题进行了彻底的讨论,似乎没有通用的方法/支持的API从不同的制造商检索每个手机上工作的SD卡安装点。
考虑到这一点,需要执行如下代码的操作,以确定是否安装了外部存储设备,以及在何处:
final String state = Environment.getExternalStorageState();
if ( Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state) ) { // we can read the External Storage...
//Retrieve the primary External Storage:
final File primaryExternalStorage = Environment.getExternalStorageDirectory();
//Retrieve the External Storages' root directory:
final String externalStorageRootDir;
if ( (externalStorageRootDir = primaryExternalStorage.getParent()) == null ) { // no parent...
Log.i("SD Card Path", "External Storage: " + primaryExternalStorage + "\n");
}
else {
final File externalStorageRoot = new File( externalStorageRootDir );
final File[] files = externalStorageRoot.listFiles();
for ( final File file : files ) {
if ( file.isDirectory() && file.canRead() && (file.listFiles().length > 0) ) { // it is a real directory (not a USB drive)...
Log.i("SD Card Path", "External Storage: " + file.getAbsolutePath() + "\n");
}
}
}
}我可能错了,但我知道SD卡可能是完全空的,最后一个条件(file.listFiles().length > 0)可以返回false。所以我想,与其检查length,不如添加file.canWrite()。这和我目前正在测试的手机(摩托罗拉Atrix MB860 --我知道,它是旧的,但我的要求之一是使它与从姜饼、API 9开始的版本兼容)一样有效,但我不确定这个条件是否能在其他手机上返回到/mnt/asec/或/mnt/obb上,最近的或者不是,因为它们都是可读的目录,因此也满足了前两个条件(如果它上写了一些东西,甚至可以将true返回给(file.listFiles().length > 0) (比如/mnt/obb上的50MB+大小文件)。
因此,简而言之,我需要知道的是,应用程序是否会对这两个位置有写权限,或者只有系统才有这样的权限。如果是,我还能检查什么才能将它们排除在我希望获得的最终路径之外:安装在设备上的外部SD卡?
提前感谢您的帮助!
发布于 2014-10-03 18:24:37
这是Nexus 5的输出
shell@hammerhead:/ $ ls -la /mnt/
drwxr-xr-x root system 1970-09-18 01:42 asec
drwx------ media_rw media_rw 1970-09-18 01:42 media_rw
drwxr-xr-x root system 1970-09-18 01:42 obb如您所见,只有root拥有对目录的写权限。因此,应用程序编写该目录的唯一方法是作为root执行。
https://stackoverflow.com/questions/26184538
复制相似问题