打开失败的 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 卡的安装状态。

希望对您有所帮助。如果您遇到任何其他问题,请告诉我。