在安卓系统中将文件写入外部存储失败

9
正如标题所示,我在写入外部存储时遇到了问题。我的调试设备是Nexus 5。事实上,我能够完美地从设备中读取文件(我一直在尝试使用Download文件夹中的文件),但无法写入它们。我知道我必须在设备未连接到计算机时进行操作。但是仍然没有起作用。
实际上,我在将数据写入SD卡之前尝试了读取其状态(当然没有成功)。无论设备是否连接到我的PC,状态都显示为“已安装”。我还将状态与 Environment.MEDIA_MOUNTED_READ_ONLY Environment.MEDIA_MOUNTED 进行了比较,但没有任何成功的结果。我的设备不处于这些状态之一。
你必须知道的一件事是,我的手机没有外部SD卡,因为它是一个内部SD卡。这导致我的设备具有外部存储的“ /storage/emulated/0/...”目录。
我还必须指出,我已经在Android清单中实现了以下标签:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 
<uses-permission android:name="ANDROID.PERMISSION.WRITE_EXTERNAL_STORAGE"/>

我不知道正在发生什么事情。另一件可能有帮助的事情是,我已经尝试使用winrar(适用于Android)管理文件,并且我已经能够在连接到我的PC以及没有连接到我的设备的情况下删除文件。所以我不知道该怎么做。
以下是我用来编写文件的代码。请注意,它应该读取一个图像文件(它确实这样做),将其转换为字符串,再将其转换回图像,然后保存到下载文件夹中:
 File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath() + "/base_image.jpg");
 // Reading a Image file from file system
 FileInputStream imageInFile = new FileInputStream(file);
 byte imageData[] = new byte[(int) file.length()];
 imageInFile.read(imageData);

 // Converting Image byte array into Base64 String
 String imageDataString = encodeImage(imageData);

 // Converting a Base64 String into Image byte array
 byte[] imageByteArray = decodeImage(imageDataString);

 File newFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "converted_image.jpg");

 //Write a image byte array into file system
 FileOutputStream imageOutFile = new FileOutputStream(newFile);

 imageOutFile.write(imageByteArray);

 imageInFile.close();
 imageOutFile.close();

我该怎么办?


你确定要写入这个文件吗?请确认该文件是否存在。 - Raghunandan
我正在创建一个新文件。或者至少,这是我正在尝试的。当我尝试创建它时,我遇到了“文件未找到异常”和“EACCES(权限被拒绝)”错误。这是我的主要问题。我做错了什么吗? - blastervla
2个回答

5

只需在您的uses-permission中将ANDROID.PERMISSION.WRITE_EXTERNAL_STORAGE更正为android.permission.WRITE_EXTERNAL_STORAGE

我遇到了这个问题,权限中的大写字母并没有起到作用。


1
我无法用言语来表达对你的回答的感激之情。这个问题困扰了我好几天,非常非常感谢你! - blastervla

3

如果文件不存在,FileOutputStream不会自动创建文件。

因此,如果文件不存在,您需要检查并创建它。

if(!newFile.exists()) {
    newFile.createNewFile();
} 

希望这能帮到你!

谢谢您的快速回复。我尝试了一下,但是当我调用“newFile.createNewFile();”方法时,它现在抛出以下异常:“java.io.IOException: open failed: EACCES(权限被拒绝)”。有什么想法可能会发生什么? - blastervla
1
在调用createFile()之前,还需要调用newFile.getParentFile().mkdirs()。P.s.如果拼错了,我就凭记忆写的 :) - vedi0boy
好的,显然您没有给应用程序适当的权限,我可以看到您在清单文件中添加了哪些权限。编辑:删除了最后一句话,它是错误的。 - vedi0boy
2
我不确定 ANDROID.PERMISSION 是否被接受。请将其更改为 android.permission 并进行测试。 - Banana droid
1
还要确保它在<application>标签之外声明。编辑:我找到了这个,它有很多解决方案:https://dev59.com/EGox5IYBdhLWcg3w95E9 - vedi0boy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接