Android:外部存储上的mkdirs()/ mkdir()返回false

时间:2011-08-27 04:33:57

标签: android android-file android-external-storage

我为此疯狂:

Log.d("STATE", Environment.getExternalStorageState());
File f = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "work_data");
Log.d("PATH", f.getAbsolutePath());
if (!f.exists()) {
    Log.d("MAKE DIR", f.mkdirs() + "");
}

输出日志如下所示:

STATE     mounted
PATH      /mnt/sdcard/DCIM/work_data
MAKE DIR  false

我确保添加正确的权限:

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

但我不知道为什么它无法创建文件夹。我也一步一步地使用mkdir()但结果是一样的。请帮我。我用Google搜索了这么多,并且在这个愚蠢的事情上花了至少两天时间。谢谢你的帮助!!

编辑:

大家好!我在<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>标记中添加了<application>。这是我的错!但是谢谢大家的回复。

15 个答案:

答案 0 :(得分:53)

我遇到了同样的问题,我确信我已将权限标记放在正确的位置,但mkdirs还没有工作,我的系统是Android 6.0,我现在解决它,你可以检查如下:

  1. 确保将权限标记放入。
  2. 打开&#34;设置/应用&#34;在你的手机中,检查你的应用程序的权限(我发现我的清单声明中的权限不在这里),打开这样的权限的开关。(我发现它默认关闭,使得&#34; mkdirs& #34;失败)
  3. enter image description here

答案 1 :(得分:27)

我遇到了同样的问题,我已经搜索了一周,试图找到答案。我想我找到了它,我觉得这很容易,你必须把使用许可声明放在正确的地方......

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.company.name" 
    android:versionCode="1"
    android:versionName="0.2">

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

当我在&lt; application&gt;&lt; / application&gt;中使用它时部分它不起作用。

答案 2 :(得分:14)

我知道这是一个老帖子,但也许我的答案可以帮助某人。

经过几天处理这个问题后,我意识到,当手机连接到PC时,它总是在开发过程中,SD卡无法使用。因此,无法尝试在其上创建目录或文件。 为了使其“更容易”,根据被测电话,它的行为似乎有所不同。

我知道这听起来很愚蠢,但是花了很多时间,其他人可能会节省。

答案 3 :(得分:7)

在OnCreate()

中添加这行代码
 /* const data is valid html document (type of string)*/
 const $ = cheerio.load(data);
 let pages = $('body > div').toArray();
 console.log(pages[0]); // Elements parsed correctly
 let htmlPages = pages.map(page => $(page).html());
 console.log(htmlPages[0]); // Here I have innerHtml, not outer...      

答案 4 :(得分:7)

仅当您的 targetSdkVersion为29或更高

时适用

Environment.getExternalStorageDirectory()在API级别29中已弃用。

要获得相同的功能,请使用此行

File mediaStorageDir = context.getExternalFilesDir(null);

如果已检查所有可能的错误,请尝试此修复程序。

已在此处回答-https://stackoverflow.com/a/61480077/7764015

答案 5 :(得分:4)

可能为时已晚,但是如果您已经允许R / W权限(也具有运行时权限)并且仍然无法正常工作,请在您的 AndroidManifest.xml

<application
........
........
android:requestLegacyExternalStorage="true">

注意:如果您要定位的是Android 10+,则必须这样做

答案 6 :(得分:2)

把这个

Log.d("MAKE DIR", f.mkdir() + "");

而不是

Log.d("MAKE DIR", f.mkdirs() + "");

或试试这个

String s=Environment.getExternalStorageDirectory().toString()+"/";
File f = new File(s+"DCIM/work_data");

答案 7 :(得分:2)

你的代码对我来说很好。你的代码没有任何问题。 如果您创建一个目录,请使用f.mkdir()而不是f.mkdirs() 您可以在mnt => Sd card => DCIM => work_data

中查看您的文件夹

答案 8 :(得分:2)

mkdirs()仅在创建目录时返回true。如果它已经存在,它应该返回false。所以我敢打赌这个目录已经存在。

答案 9 :(得分:2)

我有同样的问题,我只是想分享我的修复。 按照android 从Android 4.4开始,在应用的私人目录中读取或写入文件不需要READ_EXTERNAL_STORAGE或WRITE_EXTERNAL_STORAGE权限。

因此,您可以通过添加maxSdkVersion属性来声明仅在较低版本的Android上请求权限:

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

但是maxSdkVersion是问题,我刚删除它,现在它可以工作。

答案 10 :(得分:2)

如果你有android 6.0及更高版本,请确保gradle文件中的目标sdk小于22:

targetSdkVersion 22

或者您需要实现运行时权限。

答案 11 :(得分:1)

这可能会对将来有所帮助。

问题也可能是你写了地址“/ File / Address /”而不是你应该写

File.separator + "File" + File.separator + "Address" + File.separator

这是一个如此小而愚蠢的事情,但在浪费了我的时间后,这对我有用。

答案 12 :(得分:0)

我尝试在外部存储器中制作一组子文件夹&#39; Test / Test1 / Test2&#39;当mkdirs()继续返回false时。结果证明&#39;测试&#39;是外部存储根目录中的文件夹的保留字。这是在摩托罗拉G(XT1541)上,也可能适用于其他设备。

答案 13 :(得分:0)

对于新设备,您必须征得用户许可。

您可以在创建文件之前执行以下操作:

            boolean hasPermission = (ContextCompat.checkSelfPermission(MainActivity.this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED);
        if (!hasPermission) {
            //ask permission
            ActivityCompat.requestPermissions(MainActivity.this,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    REQUEST_WRITE_STORAGE);
        }
        else {

           //you have permission, create your file
        }

用户执行操作后,即可处理结果。

  @Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode)
    {
        case 1: {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
            {
                //you have permission, create your file
                //reload my activity with permission granted or use the features what required the permission
            } else
            {
                Toast.makeText(MainActivity.this, "The app was not allowed to write to your storage. Hence, it cannot function properly. Please consider granting it this permission", Toast.LENGTH_LONG).show();
            }
        }
    }

}

答案 14 :(得分:0)

<application
        .....
        android:requestLegacyExternalStorage="true">

做得好。