[英]Can't write file on SD-card
我试图在 SD 卡上写一张照片但没有成功。
我有在可移动存储中写入的权限并且安装了 SD 卡。
此外,我检查了 SD 卡的路径是否存在,并获得了肯定的结果。
它失败的地方是当我使用mkdir()
函数时。 它返回 false 并且没有创建文件。
我已经在三星 A6(棉花糖)和三星 Tab4(棒棒糖)上进行了测试
这是我用来检索 SD 卡路径的代码片段。
因为标准程序不适用于三星设备,所以我使用的是从 stackoverflow 答案中获取的这段代码
三星A6用这个函数返回的路径是/storage/6DD9-1D15。
public String[] getStorageDirectories() {
String[] storageDirectories;
String rawSecondaryStoragesStr = System.getenv("SECONDARY_STORAGE");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
List<String> results = new ArrayList<String>();
File[] externalDirs = getApplicationContext().getExternalFilesDirs(null);
for (File file : externalDirs) {
String path = file.getPath().split("/Android")[0];
if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && Environment.isExternalStorageRemovable(file))
|| rawSecondaryStoragesStr != null && rawSecondaryStoragesStr.contains(path)) {
results.add(path);
}
}
storageDirectories = results.toArray(new String[0]);
} else {
final Set<String> rv = new HashSet<String>();
if (!TextUtils.isEmpty(rawSecondaryStoragesStr)) {
final String[] rawSecondaryStorages = rawSecondaryStoragesStr.split(File.pathSeparator);
Collections.addAll(rv, rawSecondaryStorages);
}
storageDirectories = rv.toArray(new String[rv.size()]);
}
return storageDirectories;
}
相反,这是我用来在 SD 卡下的 DCMI 目录中写入文件夹的代码(我将在其中放置照片)
public void mkFolder(String folderPath) { // make a folder under Environment.DIRECTORY_DCIM
File folder = new File(folderPath);
try {
// MKDIRS returns false
if (folder.mkdirs()) {
Log.d(TAG, "folder created:" + folder.toString());
} else {
Log.d(TAG, "create folder fails:" + folder.toString());
}
} catch (Exception ecp) {
ecp.printStackTrace();
}
}
在 API 级别 18 及以下,您的getStorageDirectories()
将通过它的else
块。 该块假设:
SECONDARY_STORAGE
环境变量存在......这不是必需的SECONDARY_STORAGE
包含一个分隔的目录列表......这不是必需的在 API 级别 19+ 上,您的getStorageDirectories()
代码将通过其if
块。 在那里,你开始很好,调用getExternalFilesDirs()
。 如果该方法返回 2+ 项,则第二个和后续项指向可移动存储,特别是指向可移动存储上可以读写的位置。 然后,您的代码假设:
/Android
路径段...这不是必需的/Android
前面的目录路径部分表示您可以在其中创建文件和目录的位置......这永远不是真的除了getExternalFilesDirs()
等方法返回的特定目录外,您没有对可移动存储的文件系统级访问权限。
所以,要么:
坚持getExternalFilesDirs()
返回的特定位置,或
切换到使用存储访问框架,允许用户选择存储内容的位置(可能是也可能不是可移动存储)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.