Android支援四種資料存放區方式,分別是
Preference, File, DataBase, Content Provider 。這幾天工作上的一個測試程式要求儲存一個影像檔,用了用File的這種方式,有了一點小小的心得。
先說下,Preference,File, DataBase這三種方式分別對應的目錄是/data/data/Package Name/Shared_Pref, /data/data/Package Name/files, /data/data/Package Name/database 。
在Android中通常使用File儲存方式是用Context.openFileOutput(String fileName, int mode)和Context.openFileInput(String fileName)。
Context.openFileOutput(String fileName, int mode)產生的檔案自動儲存在/data/data/Package Name/files目錄下,其全路徑是/data/data/Package Name/files/fileName 。注意下,這裡的參數fileName不可以包含路徑分割符(如"/")。
通常來說,這種方式產生的檔案只能在這個apk內訪問。但這個結論是指使用Context.openFileInput(String fileName)的方式。使用這種方式,每個apk只可以訪問自己的/data/data/Package Name/files目錄下的檔案,原因很簡單,參數fileName中不可以包含路徑分割符,Android會自動在/data/data/Package Name/files目錄下尋找檔案名稱為fileName的檔案。
但是如果你直接使用這個File,那麼這個File在其它apk中也是可以訪問的,不過要注意在之前調用Context.openFileOutput(String file, int mode)時不要使用預設的mode:MODE_PRIVATE ,而應該使用MODE_WORLD_READABLE 。使用預設mode產生的檔案的許可權是“660”(也就是rw-rw----),而使用後者組建檔案的許可權是允許運行別的apk訪問的。代碼如下:
File file = new File("/data/data/Package Name/files/fileName");
另外還有一個方法可以改變這個組建檔案的許可權。可以直接在Java代碼中執行Linux命令,畢竟Android歸根到底也是Linux .代碼如下:
// Process process = Runtime.getProcess().exec("chmod 666 /data/data/Package Name/files/fileName");
//process.waitFor();
Process process = Runtime.getRuntime().exec ("ls");
BufferedReader ins = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while((line = ins.readLine())!=null)
{
Toast.makeText(this, line, Toast.LENGTH_LONG).show();
}