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" />