我有
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
在我的manifest文件中,但是当我尝试创建目录
时失败了。 Log.d(LOG_STRING, android.os.Environment.getExternalStorageState() );
java.io.File folder = new java.io.File(Environment.getExternalStorageDirectory() + java.io.File.separator + "test");
boolean success = true;
if (!folder.exists()) {
success = folder.mkdir();
}
if (success) {
Log.d(LOG_STRING, "Created directory");
} else {
Log.d(LOG_STRING, "FAILED WHILE CREATING DIRECTORY");
}
外部存储状态为"mounted",但无法创建test
目录,显示为""FAILED WHILE CREATING DIRECTORY"
"。
在手机上浏览"应用信息","修改或删除您的USB存储内容"的权限被标记为我的应用程序激活。
这可能是什么原因?手机的一些特殊设置?它是搭载安卓4.3 (API18)的三星GT-I9506。需要注意的是,getExternalStorageDirectory
不在SD卡上,而在内部存储器(/storage/emulated/0/
)上。
更新:
与同事交谈,似乎这个设备在扎根后经历了几次调整(允许特定的应用程序直接写入SD卡)。这可能不值得进一步研究,我将简单地切换到另一个设备。我会保留这个设备一段时间,如果有人提出答案,我会快速测试它是否解决了问题。
更新2:(赏金结束)
问题仍未解决,但如前所述,这很可能是这台设备非常特殊的问题。不可能在任何路径上写入,无论是外部还是内部存储,甚至在getExternalCacheDir()
返回的路径中也不行。
在我的情况下,我必须进入Settings -> Apps -> NameOfApp -> Permissions
并激活存储权限。我不知道为什么这是默认禁用的,如果我有AndroidManifest.xml上的所有权限。我用的是Moto G(第三代),安卓系统是Marshmallow 6.0。
您首先需要使用file.mkdirs()
而不是folder.mkdir()
。
如果它也不工作,那么你需要检查你是否可以访问sd卡。
您可以使用以下方法进行检查。
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;
}
阅读官方文件
您可以试试这段代码。我也在Lg g2 mini上模拟了sd卡,我只能在我的包文件夹中访问外部卡
for(File f : getExternalFilesDirs(null)){
try {
File f2 = new File(f.getAbsolutePath(), "testFile");
Log.d("test log", "file path " + f2.getAbsolutePath());
f2.createNewFile();
Log.d("test log", "file exist " + f2.exists());
} catch (IOException e) {
Log.d("test log", "error");
}
}
,输出为:
D/test log? file path /storage/emulated/0/Android/data/my.awesome.package/files/testFile
D/test log? file exist true
D/test log? file path /storage/external_SD/Android/data/my.awesome.package/files/testFile
D/test log? file exist true
试试这个:
final File externalStoragePublicDirectory = Environment.getExternalStorageDirectory();
File file = new File(externalStoragePublicDirectory, "test");
file.mkdirs();