官术网_书友最值得收藏!

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。
主站蜘蛛池模板: 巧家县| 盐山县| 呈贡县| 招远市| 乌兰县| 保亭| 湖州市| 铜鼓县| 大渡口区| 邢台市| 荣成市| 清涧县| 宜良县| 罗平县| 漠河县| 长子县| 墨竹工卡县| 木里| 万宁市| 永兴县| 阿勒泰市| 两当县| 沂源县| 大理市| 漳浦县| 罗城| 潼南县| 五河县| 马龙县| 伊金霍洛旗| 从江县| 花莲市| 内黄县| 九寨沟县| 灯塔市| 银川市| 偏关县| 自贡市| 洛南县| 金华市| 荆州市|