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

MHM*_*MHM 32 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() + "");
}
Run Code Online (Sandbox Code Playgroud)

输出日志如下所示:

STATE     mounted
PATH      /mnt/sdcard/DCIM/work_data
MAKE DIR  false
Run Code Online (Sandbox Code Playgroud)

我确保添加正确的权限:

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
Run Code Online (Sandbox Code Playgroud)

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

编辑:

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

小智 58

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

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

在此输入图像描述

  • 在Android 6.0中,您在使用它们时会请求某些权限.您可以使用函数`ActivityCompat.requestPermissions`发出请求.有关详细信息,请参阅[此处](https://developer.android.com/training/permissions/requesting.html). (7认同)
  • 非常正确但我们如何要求用户管理这个? (4认同)

小智 30

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

<?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" />
Run Code Online (Sandbox Code Playgroud)

当我在<application> </ application>部分中使用它时,它不起作用.


Cla*_* Ku 15

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

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

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


Pri*_*ary 13

仅当您的targetSdkVersion 为 29 或以上时适用

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

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

File mediaStorageDir = context.getExternalFilesDir(null);
Run Code Online (Sandbox Code Playgroud)

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

已经在这里回答 - /sf/answers/4303605421/

  • 祝福你的心!不知道我是如何错过这个的,也不知道为什么 Android Studio 没有强行警告我它已被弃用。删除它似乎是一件大事。 (2认同)

小智 9

在OnCreate()中添加这行代码

ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
Run Code Online (Sandbox Code Playgroud)

  • 我在 `Manifest` 文件中有正确的权限,它在 android 7.1 上运行良好,但在 android 9.0 上尝试不起作用,`requestPermission` 成功了,谢谢!! (2认同)
  • 这对我的 API 26+ 问题进行了排序 (2认同)

dra*_*oot 6

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

  • 不,它没有。我在行`if (!f.exists()) {`中检查它 (5认同)

Bha*_*iya 6

答案可能为时已晚,但如果您已经允许 R/W 权限(运行时权限)并且仍然不起作用,请在您的AndroidManifest.xml 中添加下面提到的行

<application
........
........
android:requestLegacyExternalStorage="true">
Run Code Online (Sandbox Code Playgroud)

注意:如果您的目标是 Android 10+,这必须是必需的