打开失败 EACCES(权限被拒绝)

3

我试图将一些字符串保存到SD卡上,但是程序抛出了一个异常open failed EACCES(权限被拒绝)。我在一个设备上进行了测试(华硕Zenfone 5),在清单文件中声明了WRITE_EXTERNAL_STORAGE权限,我的SD卡已经挂载并且可以读写数据(我通过复制一些MP3文件并播放它们来检查它)。 由于这是一个特定于手机的应用程序,而且该手机有内部和外部存储器,我想将文件保存在外部SD卡中,因此我编写了以下代码。我使用终端模拟器应用程序使用“cd”和“ls”命令获取了外部SD卡的绝对路径。我的手机没有root,因此我无法直接更改权限。我尝试了谷歌和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());
                }
            }
        }


    }
3个回答

3

我假设你的 Asus Zenfone 运行的是 Android 版本 >= KitKat。因此,自从 KITKAT 开始由于 SD 卡写入策略的重大更改,除了在应用程序私有文件夹中(也就是 SD卡 中的 /storage/../data/com.example/)之外,你将无法在 SD 卡上写入。

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

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

默认情况下,0th位置路径类似于旧API Environment.getExternalStorageDirectory()返回的路径,这是主要存储。一般来说,1st位置将是SD卡等其他存储目录。使用此文件路径在SD卡上写入内容。在写入任何内容之前,请确保验证SD卡的挂载状态。

希望这可以帮到您。如果您遇到其他问题,请告诉我。


这很有帮助,我能够在SD卡的android文件夹中写入,因为files[1]给了我那个路径,是否有任何方法可以使用此或其他方法获取SD卡的根路径? - krishna chaitanya

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

1
你能否解释一下你的答案和BlackHamm3rJack的答案有何不同? - krishna chaitanya

0

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


请提供完整的异常日志。 - Siju
如果出现 java.io.FileNotFoundException 的“文件未找到”错误,那么意味着没有名为“mydata.txt”的文件,因此我已经在外部 sdcard 文件夹中创建了一个“mydata.txt”文件并尝试了一遍。仍然得到与我之前发布的日志相同的结果。@RisingUp 已经提出了这个问题。 - krishna chaitanya
你可以检查一下上述代码在模拟器上是否能够运行吗? - Siju
@BlackHamm3rJack,我并不是说你错了,我只是想澄清一下。你在帮助我,我很感激你。不要难过。 - krishna chaitanya
这个链接应该会对你有所帮助。它讲解了如何调用openFileOutput()方法获取一个FileOutputStream对象,以便将数据写入到你的内部存储目录中的文件中。http://developer.android.com/training/basics/data-storage/files.html - Siju
显示剩余7条评论

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