0

我有一个在外部 SD 卡上执行写操作的应用程序(外部而不是设备闪存中的“外部”),但是正如这里和其他很多问题中已经彻底讨论过的那样,似乎有没有通用方式/支持的 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 - 我知道它很旧,但我的要求之一是使其与从 Gingerbread、API 9 开始的版本兼容),但我不确定是否该条件可以返回 true/mnt/asec/或其他手机,无论是否最近,因为它们的两个可读目录,因此也满足前两个条件(如果它上面写了一些东西(比如 50MB+ 大小的文件) /mnt/obb,甚至可以true返回。(file.listFiles().length > 0)/mnt/obb

所以,简而言之,我需要知道的是一个应用程序是否会对这两个位置有写权限,或者是否只有系统有这样的权限。如果是,我还可以检查什么以将它们从我希望获得的最终路径中排除:安装在设备上的外部 SD 卡?

预先感谢您的任何帮助!

4

1 回答 1

2

这是 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 身份执行

于 2014-10-03T18:24:37.920 回答