Android 写“外部”存储不在棒棒糖上工作,即使它';舱单上有什么规定
我正在尝试将应用程序本地数据文件夹中的图像保存到外部存储。我的清单包含以下内容(在清单的应用程序标记之前): 我得到这个错误:Android 写“外部”存储不在棒棒糖上工作,即使它';舱单上有什么规定,android,permissions,android-external-storage,Android,Permissions,Android External Storage,我正在尝试将应用程序本地数据文件夹中的图像保存到外部存储。我的清单包含以下内容(在清单的应用程序标记之前): 我得到这个错误: java.io.FileNotFoundException: /storage/emulated/0/Pictures/mypicture.jpg: open failed: EACCES (Permission denied) 我还尝试了稍微不同的输出路径: String sdCardPath = Environment.getExternalStorageDir
java.io.FileNotFoundException: /storage/emulated/0/Pictures/mypicture.jpg: open failed: EACCES (Permission denied)
我还尝试了稍微不同的输出路径:
String sdCardPath = Environment.getExternalStorageDirectory() + "/MyFolder";
new File(sdCardPath).mkdirs();
File outFile = new File(sdCardPath, "mypicture.jpg");
但这也给了我一个错误:
java.io.FileNotFoundException: /storage/emulated/0/MyFolder/mypicture.jpg: open failed: ENOENT (No such file or directory)
该设备运行的是Android 4.4.2,因此不需要在运行时请求权限(据我所知,它无法请求权限)
为了允许将文件保存到外部存储,是否还缺少其他内容?在Android 6中,您需要在运行时请求权限。如果您在4.4上运行,仍然有那个错误,我认为您还没有创建文件夹
String sdCardPath = Environment.getExternalStorageDirectory() + "/MyFolder";
new File(sdCardPath) .mkdirs(); //create folders where write files
File outFile = new File(sdCardPath, "mypicture.jpg");
不需要,但请尝试在清单中添加此权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE/>
试试这个:
String root = Environment.getExternalStorageDirectory().toString();
File myDir = new File(root + "/MyFolder");
myDir.mkdirs();
Random generator = new Random();
int n = 10000;
n = generator.nextInt(n);
String fname = "Image-" + n + ".jpg";
File file = new File (myDir, fname);
if (file.exists ()) file.delete ();
file.createNewFile();
try {
FileOutputStream out = new FileOutputStream(file);
FileInputStream in = new FileInputStream(filePath);
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
还要向清单添加读写权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
问题的原因是通过gradle拉入的一个外部库,它有自己的清单请求
我自己的清单只有在不包括maxSdkVersion=“18”时才起作用,因此清单合并添加该参数导致了此错误。我的解决方案是将我自己的清单更改为:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="23" tools:replace="android:maxSdkVersion" />
我假设maxSdkVersion=“18”意味着任何运行SDK 19-22的设备都不能拥有此权限(23+可以在运行时请求它)。我已经有一行代码来创建文件夹,如上图所示:new File(sdCardPath).mkdirs();这似乎解决不了问题。把我的包弄脏。您是否尝试删除android:maxSdkVersion=“18”
。或者您的目录与图片路径是否正确MyFolder\mypicture.jpg
?我尝试过使用和不使用maxSdkVersion,两者都没有区别。我相信路径是正确的,我也尝试过将mypicture.jpg直接放入Environment.getExternalStorageDirectory()中,但出现了相同的错误。这几乎就好像在安装时没有授予WRITE_EXTERNAL_存储权限,即使它肯定在清单中(我用apktool检查它是否被剥离)。我刚刚注意到一些有趣的事情。当我侧面加载应用程序并列出所需的权限时,我看不到“修改或删除SD卡内容”和“读取SD卡内容”,我在安装另一个应用程序时确实看到了这两个内容。这似乎很奇怪,因为权限明显在清单中,是否需要其他东西使这些权限出现在安装上?
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="23" tools:replace="android:maxSdkVersion" />