我真的厌倦了调试这个问题。我有一个写入存储的应用程序。该应用程序工作正常,直到我得到更新(我不知道哪个更新导致它,因为我从Android开发中断了) - 我的Android版本现在是6.0.1。
无论如何,我正在尝试写入我的外部存储设备。我准备好阅读Android的新权限系统,获得权限,我正在检查我的代码:
checkSelfPermission("android.permission.READ_EXTERNAL_STORAGE")
checkSelfPermission("android.permission.WRITE_EXTERNAL_STORAGE")
通过调试我已经检查过(我也得到一个代码,检查并询问是否需要权限,但我想确定它确实是;))我发现它们返回值0 ,等于 PackageManager.PERMISSION_GRANTED
因此,肯定会授予权限。我试图在存储中创建一个App目录来编写pdf文件,存储sqlite DB等等。
以下是我创建目录的方法:
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
// We can read and write the media
File dir = Environment.getExternalStorageDirectory();
String sNewDir = Constants.ApplicationDataDir;
if (sSubDir == null) {
sSubDir = "";
} else {
sSubDir = sSubDir.trim();
}
if (sSubDir.length() > 0) {
sNewDir += File.separator + sSubDir;
}
File dirName = new File(dir, sNewDir);
if (!dirName.exists()) {
if (!dirName.mkdirs()) {
LogDump.e("getAppDirectory err", " (sSubDir=<" + sSubDir + "> cannot create dir: " + dirName.getAbsolutePath());
}
}
return dirName;
} else {
// Something else is wrong
LogDump.e("getAppDirectory err", " (sSubDir=<" + sSubDir + "> not mounted state: " + state);
return null;
}
dirName的值是/ storage / emulated / 0 / MY_APP_CONST_VALUE / sSubDir(sSubdir是子目录的参数,即。&#34; Preferences&#34;) Soo,代码(用调试器检查)执行检查目录不存在,mkdirs()返回false结果。这实际上意味着目录不存在,无法创建。
在我的应用程序操作期间,我的日志充满了:
W/FileUtils: Failed to chmod(/storage/emulated/0/MY_APP_CONST_VALUE/DB/pcdrdata.sqlite3): android.system.ErrnoException: chmod failed: EPERM (Operation not permitted)
来自SQLLite代码 任何其他文件操作的FileNotFound异常......
这似乎很合乎逻辑,因为它无法创建目录,对吧? 现在是最令人困惑的部分:
我正在使用total commander,我可以看到实际上正在创建目录,正在复制sqlite数据库,并且所有执行FileNotFoundException的文件都在那里。我做了一个测试,删除它们,重新运行应用程序,然后再次将它们复制到该位置。但是,无法对文件执行任何读取操作。
所以它以某种方式创建目录,允许写入(甚至thouh mkdirs()另有说明),但不允许读取。
我真的很困惑,厌倦了尝试。我也尝试了没有SD卡的相同 - 虽然相同的结果......
我的应用程序创建PDF文件 - 它们创建成功,但即使是Total Commander也说它无法打开它们....
我的手机是Xperia Z3
答案 0 :(得分:0)
从KitKat开始,您无法再从外部存储的根目录中读取内容。您只能读取特殊公共目录或SD卡上自己的私人目录。如果您看到它们已创建但无法更改它们,那么Android似乎决定您可以在那里写但不能在那里阅读