启动我的Android应用程序时,我需要在SD卡上创建一个目录,对于少数用户而言,这个失败了,我无法弄清楚它的原因......
(我发现WRITE_EXTERNAL_STORAGE权限丢失导致类似的问题,它就在那里,它适用于几乎所有用户,所以我不认为这是理由)
我已经简化了以前的情况,以便更容易解释,如果创建一个directoy失败,我运行一个测试用例,我尝试在sdcard上创建一个.test目录:
new File(Environment.getExternalStorageDirectory(), ".test").mkdir() -> false
new File(Environment.getExternalStorageDirectory(), ".test").mkdirs() -> false
相关目录的文件属性:
/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上运行的)
非常欢迎建议和想法......
答案 0 :(得分:15)
在您的舱单中没有权限时很常见。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
至于我,这是唯一的错误。
答案 1 :(得分:7)
首先,技术上mkdirs()返回false并不意味着它失败了,只是意味着它没有创建目录。 如果目录已经存在,那么mkdirs()将继续返回false。
其次,在Android 6中,您不仅需要:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
你还需要一些相同的东西:
ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
有关检查权限的详细信息,请参阅:
https://github.com/googlesamples/android-RuntimePermissions
答案 2 :(得分:6)
我遇到了类似的问题,花了几个小时才意识到出了什么问题。它没有在Sumsung Mega上工作,但对于其他手机,它工作得很好。 我真的有WRITE_EXTERNAL_STORAGE权限,并且getExternalStorageDirectory已安装且可用。但是目录还没有创建。 有什么帮助? 我刚重新启动了维修!它帮助了! 遗憾的是之前没有人提出过这样的建议。希望这会有所帮助!
答案 3 :(得分:4)
我在尝试在SDCard上创建目录时遇到了问题。我发现发生的事情是我的代码在某些手机和模拟器上都可以正常工作。但是其他手机会报告错误。
我相信某些手机存在问题,Atrix和Bionic是两个例子。
使用Environment.getExternalStorageDirectory()代码时,这些手机实际上会返回/ mnt / sdcard。
然而,在这些手机上,SD卡实际上是/ mnt / sdcard-ext。
所以在某些地方看起来有些制造商破坏了getExternalStorageDirectory代码,并以某种方式返回了错误的位置。
因为我的代码在许多不同的设备上工作,我有一点时间搞清楚这一点,但仍有一些用户报告说它失败了。
答案 4 :(得分:4)
我的问题是我使用mkdir
来创建多目录路径,每次都得到false
。一旦我使用mkdirs
我的问题就解决了
答案 5 :(得分:3)
我遇到了同样的问题。权限已设置,路径也是默认路径(/ mnt / sdcard),但我的android已作为外部存储设备安装,以便快速浏览SD卡。 但是这会干扰其他应用程序。
我在潜入adb shell时想到了这一点:
$ cd /mnt
$ cd sdcard
cd: can't cd to sdcard
$ ls -l
d--------- system system 2011-12-07 01:59 sdcard
卸下我得到的图像后:
$ ls -l
drwxrwxr-x system sdcard_rw 2011-12-07 11:46 sdcard
正如您在安装时看到的那样,SD卡位于系统用户组中,并且根本没有权限。卸载后,组将更改为sdcard_rw,并且授予读写权限。
答案 6 :(得分:3)
我知道这是一个旧帖子,但我想我仍然可以提供一个建议。如果您在开发过程中运行应用程序(即手机通过USB插入PC),那么可能是PC已经安装了SD卡。您必须卸载它(您可以通过手机或PC完成)才能获得写入权限,这需要在清单中设置。
答案 7 :(得分:2)
这些用户可能有一张损坏的SD卡,因此只能以只读方式安装。如果可能,您应该与他们核实,看看是否还有其他东西可以写入文件。鉴于您拥有WRITE_EXTERNAL_STORAGE权限,您可以毫无困难地对SD卡进行修改(并且SD卡中所有内容的权限都是对这些应用程序进行全局读/写,因此没有任何内容可以解决文件权限导致它们出现问题)。
答案 8 :(得分:1)
当symlink / storage / emulated / 0以某种方式丢失时,我遇到了这个问题。我做的是使用相机应用程序拍照。我观察到图片细节表示它在/ storage / emulated / 0内,尽管该目录在文件资源管理器中不存在。然后我重新启动了手机。重启后,目录显示在文件浏览器中。
答案 9 :(得分:1)
我遇到了类似的问题。我的相机应用在Q(10)以外的所有android版本中都能正常运行。
问题是我使用了Environment.getExternalStorageDirectory();
及其在android Q(不推荐使用)中弃用。解决方案很简单,使用的是最新版本context.getExternalFilesDir()
这是我如何在所有设备上使用它的方法:-
public static boolean createDirectory(Context context, String directoryPath) {
File folder;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
folder = new File(context.getExternalFilesDir(null), directoryPath);
else
folder = new File(Environment.getExternalStorageState(), directoryPath);
if (!folder.exists()) {
return folder.mkdirs();
}
return true;
}
答案 10 :(得分:1)
如果由于引入了作用域存储,所以如果您将SDK 29或更高版本(build.gradle中的targetSdkVersion)作为目标,也会发生这种情况。
如果是这种情况,请将您的目标SDK更改为28或更低版本,或者添加:android:requestLegacyExternalStorage="true"
到您的清单中,在“应用程序”键下。
答案 11 :(得分:0)
我在使用mkdirs()时遇到了类似的问题,但是因为运行命令:
mkdir one / two
在Linux上失败,然后API(http://download.oracle.com/javase/1.4.2/docs/api/java/io/File.html#mkdirs())随后也失败了。我想这意味着在Android上无法使用mkdirs?我的(可能相当hacky)解决办法是分别创建每个必要的目录:
String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
new File(extStorageDirectory + "/one/").mkdirs();
new File(extStorageDirectory + "/one/two/).mkdirs();
答案 12 :(得分:0)
我在虚拟设备上遇到了这个问题。对我来说问题是我没有为虚拟设备定义外部存储。希望有人帮助。