三 File 資料外部儲存
每一個android裝置支援一個共用“外部儲存”,您可以使用它來儲存檔案。這可能是一個移動儲存媒體(如一個SD卡)或一個內部(固定的)儲存。檔案儲存到外部儲存是公開的,可由使用者修改他們。
注意:外部存放裝置上的檔案,所有的應用程式都可以訪問它,甚至可以串連在電腦上直接修改。
1、檢查外部存放裝置是否可用
在你使用外部存放裝置的時候,你應該總是先調用Environment.getExternalStorageState()的方法來檢查外部存放裝置的可用性。比如:
boolean mExternalStorageAvailable = false;boolean mExternalStorageWriteable = false;String state = Environment.getExternalStorageState();if (Environment.MEDIA_MOUNTED.equals(state)) {//已經插入了sd卡,並且可以讀寫 mExternalStorageAvailable = mExternalStorageWriteable = true;} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {//已經插入了sd卡,但是是唯讀情況 mExternalStorageAvailable = true; mExternalStorageWriteable = false;} else { //其他錯誤的狀態。外部存放裝置可能在其他的裝備,但是我們要知道,在這一種情況下,我們不能對其進行讀寫。 mExternalStorageAvailable = mExternalStorageWriteable = false;}
這個例子只檢查了外部存放裝置是否可讀寫,它還有很多其他的狀態,比如與電腦串連、沒有裝置、或者嚴重移除等等。
2、訪問外部儲存空間的檔案
如果使用API層級8或更高的版本,可以使用getExternalFilesDir()方法來開啟一個File對象,它代表了應該儲存檔案的外部儲存空間目錄。type表示你想要訪問什麼樣的子目錄,比如Environment.DIRECTORY_MUSIC,如果訪問根目錄,就傳入null。如果需要,這個方法會建立合適的目錄。通過指定目錄的類型,確保Android的介質掃描器把檔案正確的分類到系統中(例如,鈴聲被標識為鈴聲,而不是音樂)。如果使用者卸載了應用程式,應用對應的目錄和目錄中所有的內容將會被刪除。
如果使用API層級7或更低的版本,使用getExternalStorageDirectory()方法來開啟一個File對象,它代表了外部儲存空間的根目錄,然後應該把資料寫到下列目錄中:
/Android/data/<package_name>/files/
<package_name>是Java樣式的包名,如:com.example.android.app。如果使用者的裝置正在運行API層級8或更高的版本,並且卸載了應用程式,那麼這個目錄和其所有的內容將會被刪除。
例子:
File file = new File(Environment.getExternalStorageDirectory() +filePathName);
這種方式得到的檔案根路徑 為mnt / sdcard
File file=getExternalFilesDir(null);
這種方式得到的檔案跟路徑為 /mnt/sdcard/Android/data/包名/files
既然得到了sdcard的路徑,那麼就可以用io流來操作檔案儲存體資料了。
不過採用第二種方式得到路徑時,一定要添加下面的許可權。並且,對檔案操作時,也要添加下面的許可權。
注意,還要加許可權
<!-- 在SD卡中建立與刪除檔案許可權 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 向SD卡寫入資料許可權 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
3、對媒體瀏覽器隱藏你的檔案
在檔案名稱字前面加. 比如 .圖片1 .圖片2 等等
4、儲存應該共用的檔案
如果儲存的檔案不是應用程式所專有的,並且在應用程式被卸載時,不刪除這些檔案,那麼就要把它們儲存到外部儲存空間上的一個公用的目錄上。這些目錄位於外部儲存空間的根目錄,如Music/、Pictures/、Ringtones/等等。
在API層級8或更高的版本中,使用getExternalStoragePublicDirectory()方法,把需要的公用目錄類型傳遞給這個方法,如DIRECTORY_MUSIC、DIRECTORY_PICTURES、DIRECTORY_RINGTONES或其他的類型。如果需要,這個方法會建立適當的目錄。
如果使用API層級7或更低的版本,使用getExternalStorageDirectory()方法來開啟一個File對象,它代表了外部儲存空間的根,然後把共用檔案儲存到下列目錄之一中:
Music/---媒體掃描器把在這個目錄中找到所有媒體檔案作為使用者音樂。
Podcasts/---媒體掃描器把在這個目錄中找到的所有媒體檔案作為音/視頻的剪輯片段。
Ringtones/---媒體掃描器把在這個目錄中找到的所有媒體檔案作為鈴聲。
Alarms/---媒體掃描器把在這個目錄中找到的所有媒體檔案作為鬧鐘的聲音。
Pictures/---所有的圖片(不包括那些用照相機拍攝的照片)。
Movies/---所有的電影(不包括那些用攝像機拍攝的視頻)。
Download/---其他下載的內容。
5、儲存快取檔案
如果使用API層級8或更高的版本,使用getExternalCacheDir()來開啟一個File對象,它代表了儲存快取檔案的外部儲存空間目錄。如果卸載應用程式,這些檔案會自動的被刪除。但是,在應用的生存期間,應該自己管理這些快取檔案,並且為了保留儲存空間,應在不需要的時候刪除這些快取檔案。
如果使用API層級7或更低的版本,就要使用getExternalStorageDirectory()方法來開啟一個File對象,它代表了外部儲存空間的根目錄,然後把快取資料寫入下列目錄中:
/Android/data/<package_name>/cache/
<package_name>是Java樣式的包名,如:com.example.android.app。