我的应用可以创建一个文件,但无法读取它

时间:2015-04-30 12:53:48

标签: java android

我在内存中写了一个文件:

byte[] data = ... // (A buffer containing wav data)
String filename = context.getFilesDir().getAbsolutePath() + "/newout.wav";
File file = new File(filename);
FileOutputStream fos = new FileOutputStream(file);
fos.write(data);
fos.close();

然后我尝试播放它:

MediaPlayer player = new MediaPlayer();
player.setDataSource(filename);
player.prepare();
player.setLooping(false);
player.start();

但是prepare()失败了:

java.io.IOException: Prepare failed.: status=0x1

我检查了该文件,发现它的权限是-rw-------。我将其更改为-rw-r--r--,然后成功播放。

那么为什么我的应用程序可以写一个文件,但无法读取它?如何让FileOutputStream设置权限?

2 个答案:

答案 0 :(得分:2)

要将programaticaly文件权限更改为-rw-r - r--你需要做这样的smoething:

Process process = null;
DataOutputStream dataOutputStream = null;

try {
    process = Runtime.getRuntime().exec("su");
    dataOutputStream = new DataOutputStream(process.getOutputStream());
    dataOutputStream.writeBytes("chmod 644 FilePath\n");
    dataOutputStream.writeBytes("exit\n");
    dataOutputStream.flush();
    process.waitFor();
} catch (Exception e) {
    return false;
} finally {
    try {
        if (dataOutputStream != null) {
            dataOutputStream.close();
        }
        process.destroy();
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }
}

答案 1 :(得分:1)

如果您打开文件,则默认模式为Context.MODE_PRIVATE,例如如在

File file = new File(context.getFilesDir(), filename);

String filename = "myfile";
String string = "Hello world!";
FileOutputStream outputStream;

try {
  outputStream = openFileOutput(filename, Context.MODE_PRIVATE);
  outputStream.write(string.getBytes());
  outputStream.close();

} catch (Exception e) {
  e.printStackTrace();
}

(摘自the documentation)。模式MODE_WORLD_READABLEMODE_WORLD_WRITABLE已弃用,不适用于较新的设备。所以我说你应该写在外部存储上,以便将内容提供给其他应用程序。

注意:根据documentation

  

外部存储   "它具有世界可读性,因此保存在此处的文件可能会在您无法控制的范围内阅读。"