與前面的示例一樣,當(dāng)Camera應(yīng)用程序返回時(shí)觸發(fā)onActivityResult 方法。將新創(chuàng)建的圖像解碼成Bitmap形式并顯示。在此版本中,對(duì)相關(guān)的用戶界面元素也進(jìn)行了管理。
1.2.3 使用MediaStore檢索圖像
為了說(shuō)明在Android 上使用共享內(nèi)容提供器的能力,一個(gè)示例是使用它們可以很容易地創(chuàng)建一個(gè)類似的圖像庫(kù)應(yīng)用程序。由于內(nèi)容提供器(當(dāng)前為MediaStore)在應(yīng)用程序之間共享,因此為了使得我們自己的應(yīng)用程序可以查看圖像,實(shí)際上并不需要?jiǎng)?chuàng)建一個(gè)攝像頭應(yīng)用程序并采取方法來(lái)存儲(chǔ)圖像。由于大多數(shù)應(yīng)用程序?qū)⑹褂媚J(rèn)的MediaStore,因此可以利用它來(lái)建立我們自己的圖像庫(kù)應(yīng)用程序。
從MediaStore中選擇非常簡(jiǎn)單??梢允褂糜糜趧?chuàng)建新記錄的相同Uri來(lái)從中選擇記錄。
Media.EXTERNAL_CONTENT_URI
MediaStore和所有的內(nèi)容提供器都以一種類似數(shù)據(jù)庫(kù)的方式運(yùn)作。從它們中選擇記錄,獲得一個(gè)Cursor對(duì)象,并通過(guò)它來(lái)遍歷結(jié)果。
為了實(shí)現(xiàn)選擇,首先需要?jiǎng)?chuàng)建一個(gè)想要返回的列的字符串?dāng)?shù)組。對(duì)于MediaStore中的圖像,其標(biāo)準(zhǔn)列在MediaStore.Images.Media類中表示。
String[] columns = { Media.DATA, Media._ID, Media.TITLE, Media.DISPLAY_NAME };
為了執(zhí)行實(shí)際查詢,可以使用活動(dòng)managedQuery方法。第一個(gè)參數(shù)是Uri,隨后是列名稱的數(shù)組,后跟一條限定的WHERE子句和WHERE子句的任何參數(shù),最后是一條ORDER BY子句。
以下將選擇在最近一個(gè)小時(shí)內(nèi)創(chuàng)建的記錄,并按照從最遠(yuǎn)到最近的順序?qū)λ鼈兣判颉?/p>
首先,創(chuàng)建一個(gè)稱為oneHourAgo的變量,該變量將存儲(chǔ)從1970年1月1日到一小時(shí)前所經(jīng)過(guò)的秒數(shù)。System.currentTimeMillis( )將返回相同日期以來(lái)的毫秒數(shù),所以除以1000將獲得秒數(shù)。如果減去60分×60秒,那么將獲得一個(gè)小時(shí)前的值。
long oneHourAgo = System.currentTimeMillis()/1000 - (60 * 60);
接著,將該值放入作為WHERE子句參數(shù)的字符串?dāng)?shù)組。
String[] whereValues = {""+oneHourAgo};
然后,選擇想要返回的列。
String[] columns = {Media.DATA, Media._ID, Media.TITLE, Media.DISPLAY_NAME,
Media.DATE_ADDED };