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

时间:2015-07-10 05:23:01

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

我试图将一些字符串保存到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());
                }
            }
        }


    }

3 个答案:

答案 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的调用而不是使用硬编码目录,并通过将名称附加到该路径来打开文件