尽pipe权限显然设置正确,但无法在外部存储中创build目录

我有

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

在我的清单文件中,但是我尝试创build一个目录时失败

  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"); } 

外部存储器的状态为“已安装”,但无法创buildtest目录,输出为"FAILED WHILE CREATING DIRECTORY"

在手机浏览到“应用程序信息”中,“修改或删除USB存储设备的内容”权限被标记为为我的应用程序激活。

这可能是什么原因? 手机的一些特殊设置? 这是一款采用Android 4.3(API18)的三星GT-I9506。 要注意的是getExternalStorageDirectory不在SD卡上,而在内部存储上( /storage/emulated/0/ )。


更新:

与同事聊天,似乎这个设备经过了多次调整后(为了让一个特定的应用程序直接写在SD卡上)。 这可能是不值得进一步调查,我会简单地切换到另一个设备。 我会保持一段时间的设备,如果有人会出现答案,我会迅速testing,如果它解决了这个问题。


更新2:(赏金结束)

这个问题仍然没有得到解决,但是如前所述,这个设备最有可能是非常具体的。 无法在任何path上进行写入,无论是外部还是内部存储器,甚至getExternalCacheDir()返回的path中。

Solutions Collecting From Web of "尽pipe权限显然设置正确,但无法在外部存储中创build目录"

您首先需要使用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迷你模拟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 

在我的情况下,我不得不去Settings -> Apps -> NameOfApp -> Permissions并激活存储权限。 我不知道为什么这会默认情况下停用,如果我拥有AndroidManifest.xml的所有权限。 我正在搭配Android Marshmallow 6.0的Moto G(3rd Gen)。

尝试这个:

  final File externalStoragePublicDirectory = Environment.getExternalStorageDirectory(); File file = new File(externalStoragePublicDirectory, "test"); file.mkdirs();