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



我有

<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();

相关内容

最新更新