我试图将一些字符串保存到SD卡。但它正在抛出这个例外公开失败的EACCES(Permission denied)。我在一台设备上测试了这个(华硕zenfone 5)。我已经在清单文件-WRITE_EXTERNAL_STORAGE中声明了权限,我的SD卡已经安装,数据可以写入并从中读取(我亲自通过复制一些mp3文件并播放它们来检查它)。因为这是一个手机专用的应用程序,手机里面有一个内部和外部存储器,我想将文件保存在外部SD卡中,我写了这样的代码。我使用终端模拟器应用程序使用“cd”和“ls”命令获得了外部SD卡的绝对路径。我的手机没有root权限,所以我无法直接发出任何权限更改。我已经通过google和stackoverflow尝试了所有可能的方法。请帮帮我
public void savePublicExternalFile(String data){
File folder = new File("/Removable/MicroSD/");
//i have also tried File folder = new File("/Removable/MicroSD");
File myFile = new File(folder,"mydata.txt");
WriteData(myFile, data);
}
private void WriteData(File myFile, String data){
if(t){
Log.i("AbsolutePath",myFile.getAbsolutePath());
t = false;
}
FileOutputStream fileOutputStream=null;
try {
fileOutputStream = new FileOutputStream(myFile);
fileOutputStream.write(data.getBytes());
} catch (Exception e) {
Log.i("exception",e.toString());
} finally {
if(fileOutputStream!=null){
try {
fileOutputStream.close();
} catch (IOException e) {
Log.i("exception", e.toString());
}
}
}
}
答案 0 :(得分:3)
我认为您的 Asus Zenfon e正在Android
个版本>= KitKat
上运行。因此,由于SD卡写入策略发生重大变化,因此 KITKAT ,除了在App Private文件夹中/storage/../data/com.example/
之外,您无法在SD卡上写入内容。 em> SD卡)。
要在SD卡上访问此文件夹,API
中添加了新的KitKat
。此API将返回包含所有应用程序私有文件夹路径的文件数组。
File[] files = ContextCompat.getExternalFilesDirs(context, null)
默认情况下,0th
位置路径类似于较旧的API Environment.getExternalStorageDirectory()
返回的路径,这是主存储。 1st
位置(一般情况下)一般是SD卡的其他存储目录。使用此文件路径在SD卡上写入。确保在写入任何内容之前验证SD卡的已安装状态。
希望这有帮助。如果您遇到任何其他问题,请告诉我。
答案 1 :(得分:1)
前几天我尝试使用此代码保存图像,它对我有用。
void saveFile() {
String RootDir = Environment.getExternalStorageDirectory()
+ File.separator + "any_folder";
File myDir = new File(RootDir);
myDir.mkdirs();
String fname = "mydata.txt";
File file = new File(myDir, fname);
if (file.exists())
file.delete();
try {
FileOutputStream out = new FileOutputStream(file);
out.write(data.getBytes());
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
Toast.makeText(AddText.this, "File saved to 'any_folder' folder",
Toast.LENGTH_LONG).show();
}
答案 2 :(得分:0)
尝试使用对Environment.getExternalStorageDirectory
的调用而不是使用硬编码目录,并通过将名称附加到该路径来打开文件