2015-04-30 47 views
3

我寫在內部存儲器中的文件:我的應用程序可以創建一個文件,但不能讀取它

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設置權限?

+0

您是否在AndroidManifest.xml中添加了以下權限:? –

+0

我認爲你正在寫內存的文件,請檢查路徑 –

+0

這是在內部存儲器中:'/ data/data/xx.xxx.xxx/files/newout.wav' – Mousa

回答

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

好的,這有幫助,但從使用'su'來判斷,它需要root權限,對吧? – Mousa

+0

是的,你需要在你的機器上擁有管理員的權限 –

+1

嗯,我使用這種方法,但由於我擁有該文件,我甚至不需要'su'! – Mousa

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

外部存儲: 。「這是世界可讀的,所以在這裏保存的文件可能會在您的控制之外讀」

+0

我不想讓它可用於其他應用程序!寫作和閱讀都發生在同一個應用程序中。 – Mousa

+0

更改爲'MODE_WORLD_READABLE'使其可讀,但我想知道爲什麼'rw -------'是不夠的,當它在同一個應用程序?! – Mousa

+0

據我記得,所有的應用程序都以自己的用戶身份運行,並且您上面提到的權限只允許您的應用程序進行編寫和讀取。然而,_MediaPlayer_是另一個作爲另一個用戶運行的應用程序的一部分,該用戶在默認情況下沒有訪問權限。將權限擴展到'-rw-r - r - '後,所有用戶都有權讀取(包括系統_MediaPlayer_)**頁。:**請注意'MODE_WORLD_READABLE' - 它可能並不總是有效 – Trinimon

相關問題