- Android Studio開發(fā)實戰(zhàn):從零基礎(chǔ)到App上線(第2版)
- 歐陽燊
- 1728字
- 2019-12-06 12:07:27
4.3 SD卡文件操作
本節(jié)介紹Android的文件存儲方式—— SD卡的用法,包括如何獲取SD卡目錄信息、公有存儲空間與私有存儲空間的區(qū)別、在SD卡上讀寫文本文件、在SD卡讀寫圖片文件等功能。
4.3.1 SD卡的基本操作
手機(jī)的存儲空間一般分為兩塊,一塊用于內(nèi)部存儲,另一塊用于外部存儲(SD卡)。早期的SD卡是可插拔式的存儲芯片,不過自己買的SD卡質(zhì)量參差不齊,經(jīng)常會影響App的正常運(yùn)行,所以后來越來越多的手機(jī)把SD卡固化到手機(jī)內(nèi)部,雖然拔不出來,但是Android仍然稱之為外部存儲。
獲取手機(jī)上的SD卡信息通過Environment類實現(xiàn),該類是App獲取各種目錄信息的工具,主要方法有以下7種。
- getRootDirectory:獲得系統(tǒng)根目錄的路徑。
- getDataDirectory:獲得系統(tǒng)數(shù)據(jù)目錄的路徑。
- getDownloadCacheDirectory:獲得下載緩存目錄的路徑。
- getExternalStorageDirectory:獲得外部存儲(SD卡)的路徑。
- getExternalStorageState:獲得SD卡的狀態(tài)。
SD卡狀態(tài)的具體取值說明見表4-1。
表4-1 SD卡的存儲狀態(tài)取值說明

- getStorageState:獲得指定目錄的狀態(tài)。
- getExternalStoragePublicDirectory:獲得SD卡指定類型目錄的路徑。
目錄類型的具體取值說明見表4-2。
表4-2 SD卡的目錄類型取值說明

為正常操作SD卡,需要在AndroidManifest.xml中聲明SD卡的權(quán)限,具體代碼如下:

下面演示一下Environment類各方法的使用效果,如圖4-10所示。頁面上展示了Environment類獲取到的系統(tǒng)及SD卡的相關(guān)目錄信息。

圖4-10 某設(shè)備上的SD卡目錄信息
4.3.2 公有存儲空間與私有存儲空間
本來在AndroidManifest.xml里面配置了存儲空間的權(quán)限,代碼就能正常讀寫SD卡的文件。可是Android從7.0開始加強(qiáng)了SD卡的權(quán)限管理,即使App聲明了完整的SD卡操作權(quán)限,系統(tǒng)仍然默認(rèn)禁止該App訪問外部存儲。打開7.0系統(tǒng)的設(shè)置界面,進(jìn)入到具體應(yīng)用的管理頁面,會發(fā)現(xiàn)應(yīng)用的存儲功能被關(guān)閉了(指外部存儲),如圖4-11所示。

圖4-11 系統(tǒng)設(shè)置頁面里的SD卡讀寫權(quán)限開關(guān)
不過系統(tǒng)默認(rèn)關(guān)閉存儲其實只是關(guān)閉外部存儲的公共空間,外部存儲的私有空間依然可以正常讀寫。這是緣于Android把外部存儲分成了兩塊區(qū)域,一塊是所有應(yīng)用均可訪問的公共空間,另一塊是只有應(yīng)用自己才可訪問的專享空間。之前講過,內(nèi)部存儲保存著每個應(yīng)用的安裝目錄,但是安裝目錄的空間是很緊張的,所以Android在SD卡的“Android/data”目錄下給每個應(yīng)用又單獨建了一個文件目錄,用于給應(yīng)用保存自己需要處理的臨時文件。這個給每個應(yīng)用單獨建立的文件目錄,只有當(dāng)前應(yīng)用才能夠讀寫文件,其他應(yīng)用是不允許進(jìn)行讀寫的,故而“Android/data”目錄算是外部存儲上的私有空間。這個私有空間本身已經(jīng)做了訪問權(quán)限控制,因此它不受系統(tǒng)禁止訪問的影響,應(yīng)用操作自己的文件目錄就不成問題了。當(dāng)然,因為私有的文件目錄只有屬主應(yīng)用才能訪問,所以一旦屬主應(yīng)用被用戶卸載,那么對應(yīng)的文件目錄也會一起被清理掉。
既然外部存儲分成了公共空間和私有空間兩部分,這兩部分空間的路徑獲取也就有所不同。獲取公共空間的存儲路徑,調(diào)用的是Environment.getExternalStoragePublicDirectory方法;獲取應(yīng)用私有空間的存儲路徑,調(diào)用的是getExternalFilesDir方法。下面是分別獲取兩個空間路徑的代碼例子:

該例子運(yùn)行之后獲得的路徑信息如圖4-12所示,可見應(yīng)用的私有空間路徑位于“外部存儲根目錄/Android/data/應(yīng)用包名/files/Download”這個目錄之下。

圖4-12 公共存儲與私有存儲的各自目錄路徑
4.3.3 文本文件讀寫
文本文件的讀寫一般借助于FileOutputStream和FileInputStream。其中,F(xiàn)ileOutputStream用于寫文件,F(xiàn)ileInputStream用于讀文件。文件輸出輸入流是Java語言的基礎(chǔ)工具,這里不再贅述,直接給出具體的實現(xiàn)代碼:

文本文件的讀寫效果如圖4-13所示,此時App把注冊信息保存到SD卡的文本文件中。接著進(jìn)入文件列表讀取頁面,選中某個文件,頁面就展示該文件的文本內(nèi)容,如圖4-14所示。

圖4-13 將注冊信息保存到文本文件

圖4-14 從文本文件讀取注冊信息
4.3.4 圖片文件讀寫
Android的圖片處理類是Bitmap,App讀寫B(tài)itmap可以使用FileOutputStream和FileInputStream。不過在實際開發(fā)中,讀寫圖片文件一般用性能更好的BufferedOutputStream和BufferedInputStream。
保存圖片文件時用到Bitmap的compress方法,可指定圖片類型和壓縮質(zhì)量;打開圖片文件時使用BitmapFactory的decodeStream方法。讀寫圖片的具體代碼如下:

接下來是演示時間,如圖4-15所示,用戶在注冊頁面錄入注冊信息,App調(diào)用getDrawingCache方法把整個注冊界面截圖并保存到SD卡;然后在另一個頁面的圖片列表選擇SD卡上的指定圖片文件,頁面就會展示上次保存的注冊界面圖片,如圖4-16所示。

圖4-15 保存注冊信息圖片

圖4-16 讀取注冊信息圖片
剛才從SD卡讀取圖片文件用到了BitmapFactory的decodeStream方法,其實BitmapFactory還提供了其他方法,用起來更簡單、方便,說明如下:
- decodeFile:該方法直接傳文件路徑的字符串,即可將指定路徑的圖片讀取到Bitmap對象。
- decodeResource:該方法可從資源文件中讀取圖片信息。第一個參數(shù)一般傳getResources(),第二個參數(shù)傳drawable圖片的資源id,如R.drawable.phone。
- App Inventor移動應(yīng)用開發(fā)標(biāo)準(zhǔn)教程
- 無線電壓制技術(shù)及應(yīng)用
- LED顯示屏組裝與調(diào)試全攻略
- 現(xiàn)代移動通信網(wǎng)絡(luò)技術(shù)
- 彩色電視機(jī)現(xiàn)場維修實錄
- 從算法到電路:數(shù)字芯片算法的電路實現(xiàn)
- 微信小程序開發(fā)與運(yùn)營
- 常用電子元器件識別/檢測/選用一讀通(第2版)
- 核心網(wǎng)架構(gòu)與關(guān)鍵技術(shù)
- 3D顯示技術(shù)、標(biāo)準(zhǔn)與應(yīng)用
- 光網(wǎng)絡(luò)信息傳輸技術(shù)
- 光傳送網(wǎng)(OTN)技術(shù)、設(shè)備及工程應(yīng)用
- 電冰箱、空調(diào)器原理與維修·電視機(jī)原理與維修
- GSM網(wǎng)絡(luò)優(yōu)化理論與實踐
- Altium Designer 15原理圖與PCB設(shè)計教程