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