Android – Uninstall Application with delete external storage folders/files
最近在撰寫Android應用程式的時候,剛好會把一些程式使用的資料儲存至SD Card(或稱External Storage)裡,
讓手機使用儲存空間比較少,而且對於一些大型檔案的儲存也能確保有足夠的空間。
今天遇到一個問題:
「當今天應用程式被移除的時候,但整個應用程式使用到SD Card儲存區的檔案卻沒有被完整移除,造成一下次
用戶重新安裝時,卻能存取到之前留下來的資料。」
那要怎麼辦才能在程式移除的時候,一併清除該應用程式所產生的相關資料與檔案呢?
我查詢了相關<Data Storage>上所撰寫的說明,對於Android應用程式存取External Storage的方式有幾種:
〉Environment.getExternalStorageDirectory().getAbsolutePath():
該方式是最常使用的方式,透過Environment取得實際手機的SD Card位置,再配合應用程式的需要,
建置多個資料夾或多個檔案,讓應用程式與資料儲存區做個分開,其寫法如下:
1: private void CreateExternalStorage(Context pContext){
2: //取得目前External Storage使用的狀態
3: String state = Environment.getExternalStorageState();
4: //取得External Storage的實際位置
5: String tSDPath = Environment.getExternalStorageDirectory().getAbsolutePath();
6: //建立特定的資料夾
7: File tFolder = new File(tSDPath, "UNProj");
8: boolean tCreate = false;
9: if ( tFolder.exists() == false ) {
10: tCreate = tFolder.mkdirs();
11: }
12: //新增檔案
13: File tFile = new File(tFolder, "text.xml");
14: try {
15: String tContent = "<data></data>";
16: FileOutputStream tFOStream = new FileOutputStream(tFile);
17: OutputStreamWriter tOSWriter = new OutputStreamWriter(tFOStream);
18: tOSWriter.write(tContent);
19: tOSWriter.flush();
20: tOSWriter.close();
21: tFOStream.flush();
22: tFOStream.close();
23: } catch (FileNotFoundException e) {
24: // TODO Auto-generated catch block
25: e.printStackTrace();
26: } catch (IOException e) {
27: // TODO Auto-generated catch block
28: e.printStackTrace();
29: }
30: }
上述該程式段,建立的資料夾路徑為:「mnt/sdcard/UNProj/text.xml」。
這樣的路徑其實是與應用程式的關聯直接分開的,Android系統並不會知道該路徑下的資料夾與檔案,是否與你
的應用程式有所關聯,因此,造成在應用程式被移除的時候,該應用程式產生的目錄與檔案都不會被一併刪除。
〉Context.getExternalFilesDir(null).getAbsolutePath():
該方法是透過「Context」來取得應用程式專用的External Storage使用目錄,例如:應用程式的Namespace:
「com.pou.android」,那取得的目錄路徑為:「/mnt/sdcard/Android/data/com.pou.android/files」,該目
錄被建立於"Android"目錄下,並按依專案名稱為命名。這樣的建立方式所產生的檔案,其他的應用程式是不可
見的,屬性於私人的應用。然而,透過這樣的建置方式,Android系統即可以得知該應用程式與External Stroage
中的目錄與檔案關係,在應用程式被刪除時一併刪除所有相關的檔案與目錄,其寫法如下:
1: private void CreateExternalStorage(Context pContext){
2: //取得Content中對應的Extrenal Files Directory路徑
3: String tSDPath = pContext.getExternalFilesDir(null).getAbsolutePath();
4: //建立特定的目錄
5: File tFolder = new File(tSDPath, "UNProj");
6: boolean tCreate = false;
7: if ( tFolder.exists() == false ) {
8: tCreate = tFolder.mkdirs();
9: }
10: //建立檔案
11: File tFile = new File(tFolder, "text.xml");
12: try {
13: String tContent = "<data></data>";
14: FileOutputStream tFOStream = new FileOutputStream(tFile);
15: OutputStreamWriter tOSWriter = new OutputStreamWriter(tFOStream);
16: tOSWriter.write(tContent);
17: tOSWriter.flush();
18: tOSWriter.close();
19: tFOStream.flush();
20: tFOStream.close();
21: } catch (FileNotFoundException e) {
22: // TODO Auto-generated catch block
23: e.printStackTrace();
24: } catch (IOException e) {
25: // TODO Auto-generated catch block
26: e.printStackTrace();
27: }
28: }
======
以上是簡單記錄在撰寫Android應用程式時,如果需要讓自己的應用程式被移除時,可以一併移除相關的目錄與檔案時,
可以使用的方式,並且簡略說明其概念。如果有撰寫錯誤或觀念不正確的地方,也請大家指點一下,非常感謝。
References: