Android – Uninstall Application with delete external storage folders/files

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: }
      上述程式建立的路徑為:「/mnt/sdcard/Android/data/com.pou.android/files/UNProj/text.xml」。

======   

以上是簡單記錄在撰寫Android應用程式時,如果需要讓自己的應用程式被移除時,可以一併移除相關的目錄與檔案時,

可以使用的方式,並且簡略說明其概念。如果有撰寫錯誤或觀念不正確的地方,也請大家指點一下,非常感謝。

 

References:

Data Storage

 

Dotblogs Tags: