【问题标题】:open failed EACCES (Permission denied)打开失败的 EACCES(权限被拒绝)
【发布时间】:2015-07-10 05:23:00
【问题描述】:

我试图将一些字符串保存到 sd 卡。但它抛出了这个异常打开失败的 EACCES(权限被拒绝)。我在设备(华硕 zenfone 5)上对此进行了测试。我已经在清单文件-WRITE_EXTERNAL_STORAGE 中声明了权限,我的 sd 卡已安装并且可以从中写入和读取数据(我通过复制一些 mp3 文件并播放它们亲自检查了它)。因为这是一个特定于手机的应用程序,并且手机中有一个内部和外部存储,我想将文件保存在外部 sdcard 中,所以我编写了这样的代码。我通过使用“cd”和“ls”命令使用终端仿真器应用程序获得了外部 sd 卡的绝对路径。我的手机没有植根,所以我不能直接发布任何权限更改。我已经尝试了谷歌和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());
                }
            }
        }


    }

【问题讨论】:

    标签: android file-io android-sdcard file-access


    【解决方案1】:

    我假设您的 Asus Zenfone 在 Android 版本 >= KitKat 上运行。因此,由于 KITKAT 由于 SD 卡写入策略的重大变化,您将无法在 SD 卡上写入,除非在您的 App Private 文件夹(即 SD 卡中的 /storage/../data/com.example/ )。

    要访问 SD 卡上的这个文件夹,KitKat 中添加了新的API。此 API 将返回一个包含所有应用程序私有文件夹路径的文件数组。

    File[] files = ContextCompat.getExternalFilesDirs(context, null)
    

    默认情况下,0th 位置路径类似于旧 API Environment.getExternalStorageDirectory() 返回的路径,这是主存储。 1st 位置(一般)为其他存储目录,一般为SD卡。使用此文件路径写入 SD 卡。在写入任何内容之前,请务必验证 SD 卡的已安装状态。

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

    【讨论】:

    • 这很有帮助,我可以在 sd 卡的 android 文件夹中写入,因为 files[1] 给了我那个路径,有什么方法可以让我使用这个获取 sd 卡的根路径或任何其他方法?
    【解决方案2】:

    几天前,我尝试使用此代码保存图像,它对我有用。

    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();
    }
    

    【讨论】:

    • 你能解释一下你的答案和 BlackHamm3rJack 的答案有什么区别吗?
    【解决方案3】:

    不要使用硬编码目录,而是尝试调用Environment.getExternalStorageDirectory 并通过将名称附加到该路径来打开文件

    【讨论】:

    • 做到了,但没有积极的结果
    • 是的,我仍然遇到同样的问题。
    • 请提供异常的完整日志
    • @RisingUp 这里是日志“I/exception: java.io.FileNotFoundException: /Removable/MicroSD/mydata.txt: open failed: EACCES (Permission denied)”
    • 传递给WriteData文件的字符串而不是类,因为File类,afaik需要文件存在
    猜你喜欢
    • 1970-01-01
    • 2017-07-10
    • 2012-09-07
    • 2020-11-29
    • 1970-01-01
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多