[英]Android failed to mkdir() on SD card
我有一些代码可以在SD卡上创建/获取文件夹:
if( hasSDCard() ){
UUID uniqueFileName = UUID.randomUUID();
mediaStorageDir = new File(
getExternalImageStoragePath(),
"MyApp");
if ( ! mediaStorageDir.exists() ){
if( ! mediaStorageDir.mkdirs() ){
MyLogger.Error("Create image directory FAILED. path: " + mediaStorageDir.getPath());
return null;
}
}
并且我已经在清单文件中注册了权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STOREAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
但是当我运行它时,它会打印:
Create image directory FAILED. path: /storage/emulated/0/Pictures/MyApp
我想知道为什么会这样吗?
===更新===
我已经尝试了所有这些:
/**
* get external storage directory path for image
* @return
*/
public static String getExternalImageStoragePath(){
String strPath = "";
if(hasSDCard()){
//strPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getPath();
//strPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath();
//strPath = Environment.getExternalStorageDirectory().getPath();
strPath = Environment.getExternalStorageDirectory().getAbsolutePath();
}
return strPath;
}
但是他们的行为完全一样...
===更新2 ===
我正在测试Nexus5。我看到了这篇文章在Eclipse中找不到Nexus 7的storage / emulated / 0 /文件夹可能有问题吗?
===更新3 ===
>> adb shell ls -l /storage/
dr-xr-xr-x root root 1970-01-24 23:48 emulated
lrwxrwxrwx root root 1970-01-24 23:48 sdcard0 -> /storage/emulated/legacy
>> adb shell ls -l /storage/emulated/0/Pictures/
/storage/emulated/0/Pictures/: No such file or directory
===更新4 ===
这是我的hasSD()
方法:
public static boolean hasSDCard(){
boolean fHasSDCard = false;
if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){
fHasSDCard = true;
}
return fHasSDCard;
}
编辑:您拼错了您的权限(您有STOREAGE,而正确的是STORAGE)
更改
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STOREAGE"/>
至:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
除非您尚未在hasSDCard()中进行此操作,否则请检查您的外部媒体是否完全可用。 正如文档所说:
在使用外部存储进行任何操作之前,应始终调用getExternalStorageState()来检查介质是否可用。 介质可能已安装到计算机上,丢失,只读或处于其他某种状态。
他们提供了一个示例:
boolean mExternalStorageAvailable = false;
boolean mExternalStorageWriteable = false;
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
// We can read and write the media
mExternalStorageAvailable = mExternalStorageWriteable = true;
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
// We can only read the media
mExternalStorageAvailable = true;
mExternalStorageWriteable = false;
} else {
// Something else is wrong. It may be one of many other states, but all we need
// to know is we can neither read nor write
mExternalStorageAvailable = mExternalStorageWriteable = false;
}
// try this
File mediaStorageDir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + "MyApp" + "/");
if (!mediaStorageDir.exists()) {
mediaStorageDir.mkdirs();
}
mediaStorageDir.getAbsolutePath()
尝试这个:
mediaStorageDir = new File(
Environment.getExternalStorageDirectory().getAbsolutePath(),
"MyApp");
这就是我正在做的事情,对我有用
File path = Environment.getExternalStorageDirectory();
String save_path = path.toString() + "/MyApp/";
File newFile=new File(save_path );
newFile.mkdirs();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.