当父目录可写时,mkdirs对sd卡上的目录返回false

Dan*_*nny 19 android mkdir android-sdcard

当我启动我的Android应用程序时,我需要在SD卡上创建一个目录,对于少数用户而言这是失败的,我无法弄清楚它的原因......

(我发现WRITE_EXTERNAL_STORAGE权限丢失导致类似的问题,它就在那里,它适用于几乎所有用户,所以我认为这不是原因)

我已经简化了以前的情况,以便更容易解释,如果创建一个directoy失败,我运行一个测试用例,我尝试在sdcard上创建一个.test目录:

new File(Environment.getExternalStorageDirectory(), ".test").mkdir() -> false
new File(Environment.getExternalStorageDirectory(), ".test").mkdirs() -> false
Run Code Online (Sandbox Code Playgroud)

相关目录的文件属性:

/sdcard/.test(exists = false canWrite = false canRead = false canExecute = err isDirectory = false isFile = false)

/ sdcard(exists = true canWrite = true canRead = true canExecute = err isDirectory = true isFile = false)

/(exists = true canWrite = false canRead = true canExecute = err isDirectory = true isFile = false)

getExternalStorageState =装

(canExecute返回错误,因为测试是在sdk <9上运行的)

建议和想法非常受欢迎......

Vla*_*nov 15

您在清单中没有权限时很常见.

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

至于我,这是唯一错误的事情.

  • 对于极少数用户我只有这个问题而且我的AndroidManifest.xml在清单标签内有WRITE_EXTERNAL_STORAGE权限所以我很遗憾地说这不是原因.. (5认同)

swo*_*oby 7

首先,技术上mkdirs()返回false并不意味着它失败了,它只是意味着它没有创建目录.如果目录已经存在,那么mkdirs()将继续返回false.

其次,在Android 6中,您不仅需要:

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

你还需要一些相当于:

ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
Run Code Online (Sandbox Code Playgroud)

有关检查权限的详细信息,请参阅:https:
//github.com/googlesamples/android-RuntimePermissions


小智 6

我有一个类似的问题,花了几个小时才意识到出了什么问题.它不适用于Sumsung Mega,但对于其他手机,它工作得很好.我真的有WRITE_EXTERNAL_STORAGE权限,并且getExternalStorageDirectory已安装且可用.但是仍然没有创建目录.有什么帮助?我刚重新启动了维修!它帮助了!遗憾的是之前没有人提出过这样的建议.希望这会有所帮助!