如果我們想要讀取或者向SD卡寫入,這時就必須先要判斷一個SD卡的狀態,否則有可能出錯。
那麼SD卡狀態為什麼時才能讀取呢,經過我的各種情況的實踐,大致如下:
SD狀態 |
現象描述 |
/mnt/sdcard目錄是否存在 |
canRead返回 |
canWrite返回 |
在/mnt/sdcard建立檔案 |
在/mnt/sdcard建立檔案夾 |
|
MEDIA_MOUNTED |
SD卡正常掛載 |
TRUE |
TRUE |
TRUE |
TRUE |
TRUE |
|
MEDIA_REMOVED |
無介質 |
TRUE |
FALSE |
FALSE |
false: 原因Permission denied |
FALSE |
|
MEDIA_UNMOUNTED |
有介質,未掛載,在系統中刪除 |
TRUE |
FALSE |
FALSE |
false: 原因Permission denied |
FALSE |
|
MEDIA_BAD_REMOVAL |
介質在掛載前被移除,直接取出SD卡 |
TRUE |
FALSE |
FALSE |
false: 原因Permission denied |
FALSE |
|
MEDIA_CHECKING |
正在磁碟檢查,剛裝上SD卡時 |
TRUE |
FALSE |
FALSE |
false: 原因Permission denied |
FALSE |
|
MEDIA_SHARED |
SD卡存在但沒有掛載,並且通過USB大型存放區共用,操作開啟USB儲存 |
TRUE |
FALSE |
FALSE |
false: 原因Permission denied |
FALSE |
|
MEDIA_MOUNTED_READ_ONLY |
sd卡存在並且已掛載,但是掛載方式為唯讀 |
|
|
- |
- |
|
無法類比,SD卡不允許修改許可權 |
MEDIA_NOFS |
介質存在但是為空白或用在不支援的檔案系統 |
|
|
- |
- |
|
無法類比,SD卡格式化後再載入會自動產生系統檔案 |
MEDIA_UNMOUNTABLE |
存在SD卡但是不能掛載,例如發生在介質損壞 |
|
|
- |
- |
|
無法類比 |
通過上表可以看出,只有在SD卡狀態為MEDIA_MOUNTED時/mnt/sdcard目錄才是可讀可寫,並且可以建立目錄及檔案。
所以我們讀取SD卡時一般會這麼寫:
?
010203040506 |
String state; String path; state = Environment.getExternalStorageState(); if (state.equals(Environment.MEDIA_MOUNTED)){
path = Environment.getExternalStorageDirectory().getAbsolutePath(); } |
讀寫SD卡記得加這兩個許可權:
?
01 02 |
<uses-permission android:name= "android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name= "android.permission.WRITE_EXTERNAL_STORAGE" />
|
* 1 在AndroidManifest檔案中加入sdcard操作許可權
* <!--在SDCard中建立與刪除檔案許可權 -->
* <uses-permissioandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
* <!--往SDCard寫入資料許可權 -->
* <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
* 2 確認sdcard的存在
* android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)
* 3 擷取擴充存放裝置的檔案目錄
* android.os.Environment.getExternalStorageDirectory();
/////////////////////////////////////////////////
http://www.vogella.com/articles/Android/article.html#resources_android
http://www.coreservlets.com/android-tutorial/