Android无法在SD卡上使用mkdir()
我有一些代码在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; } }
并且我在我的清单文件中注册了许可:
但是当我运行它时,会打印:
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 ===
我正在使用Nexus 5进行测试。我看到这篇文章在Eclipse中找不到存储/模拟/ 0 / Nexus 7文件夹可能存在一些问题?
===更新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)
更改
至:
除非你在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();