打开失败的 EACCES(权限被拒绝)
open failed EACCES (Permission denied)
我正在尝试将一些字符串保存到 SD 卡。但它抛出了这个异常 open failed EACCES (Permission denied)。我在设备(asus zenfone 5)上对此进行了测试。我已经在清单file-WRITE_EXTERNAL_STORAGE中声明了权限,我的sd卡已经挂载,可以写入和读取数据(我已经通过复制一些mp3文件并播放它们来亲自检查它)。因为这是一个 phone 特定的应用程序,并且 phone 有内部和外部存储,我想将文件保存在外部 sdcard 中,我写了这样的代码。我通过使用 "cd" 和 "ls" 命令获得了使用终端模拟器应用程序的外部 SD 卡的绝对路径。我的 phone 没有 root,所以我不能直接发布任何权限更改。我已经尝试了 google 和 Whosebug 所有可能的方法。请帮帮我
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());
}
}
}
}
尝试调用 Environment.getExternalStorageDirectory
并通过将名称附加到该路径来打开文件,而不是使用硬编码目录
几天前,我尝试使用此代码保存图像,它对我有用。
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();
}
我假设您的 Asus Zenfone 在 Android
版本 >= KitKat
上是 运行。因此,由于 KITKAT 由于 SD 卡写入策略的重大变化,您将无法在 SD 卡上写入,除了您的 App Private 文件夹(位于 /storage/../data/com.example/
SD 卡)。
要访问 SD 卡上的此文件夹,KitKat
中添加了新的 API
。此 API 将 return 包含所有应用私人文件夹路径的文件数组。
File[] files = ContextCompat.getExternalFilesDirs(context, null)
默认情况下,0th
位置路径类似于 return 由较早的 API Environment.getExternalStorageDirectory()
编辑的路径,这是主存储。 1st
位置(一般)会是其他存储目录,一般是SD卡。使用此文件路径写入 SD 卡。确保在写入任何内容之前验证 SD 卡的安装状态。
希望对您有所帮助。如果您遇到任何其他问题,请告诉我。
我正在尝试将一些字符串保存到 SD 卡。但它抛出了这个异常 open failed EACCES (Permission denied)。我在设备(asus zenfone 5)上对此进行了测试。我已经在清单file-WRITE_EXTERNAL_STORAGE中声明了权限,我的sd卡已经挂载,可以写入和读取数据(我已经通过复制一些mp3文件并播放它们来亲自检查它)。因为这是一个 phone 特定的应用程序,并且 phone 有内部和外部存储,我想将文件保存在外部 sdcard 中,我写了这样的代码。我通过使用 "cd" 和 "ls" 命令获得了使用终端模拟器应用程序的外部 SD 卡的绝对路径。我的 phone 没有 root,所以我不能直接发布任何权限更改。我已经尝试了 google 和 Whosebug 所有可能的方法。请帮帮我
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());
}
}
}
}
尝试调用 Environment.getExternalStorageDirectory
并通过将名称附加到该路径来打开文件,而不是使用硬编码目录
几天前,我尝试使用此代码保存图像,它对我有用。
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();
}
我假设您的 Asus Zenfone 在 Android
版本 >= KitKat
上是 运行。因此,由于 KITKAT 由于 SD 卡写入策略的重大变化,您将无法在 SD 卡上写入,除了您的 App Private 文件夹(位于 /storage/../data/com.example/
SD 卡)。
要访问 SD 卡上的此文件夹,KitKat
中添加了新的 API
。此 API 将 return 包含所有应用私人文件夹路径的文件数组。
File[] files = ContextCompat.getExternalFilesDirs(context, null)
默认情况下,0th
位置路径类似于 return 由较早的 API Environment.getExternalStorageDirectory()
编辑的路径,这是主存储。 1st
位置(一般)会是其他存储目录,一般是SD卡。使用此文件路径写入 SD 卡。确保在写入任何内容之前验证 SD 卡的安装状态。
希望对您有所帮助。如果您遇到任何其他问题,请告诉我。