為了獲得存儲(chǔ)圖像的標(biāo)準(zhǔn)位置,首先需要獲取MediaStore的引用。為此,使用一個(gè)內(nèi)容解析器。內(nèi)容解析器是用于訪問(wèn)內(nèi)容提供器(例如MediaStore)的方法。
通過(guò)傳遞一個(gè)特定的Uri,內(nèi)容解析器將提供一個(gè)MediaStore接口作為內(nèi)容提供器。由于是插入一幅新圖像,因此我們使用的方法是insert,并且應(yīng)該使用的Uri將包含在android. provider.MediaStore.Images.Media類(lèi)的常量EXTERNAL_CONTENT_URI中。這意味著我們想要將圖像存儲(chǔ)在設(shè)備的主要外部存儲(chǔ)器上(一般是SD卡)。反之,如果想要將它存儲(chǔ)在設(shè)備的內(nèi)存中,那么可以使用INTERNAL_CONTENT_URI。然而,對(duì)于存儲(chǔ)如圖像、音頻、視頻等大小可能會(huì)相當(dāng)大的媒體,通常需要使用EXTERNAL_CONTENT_URI。
前面顯示的插入調(diào)用返回一個(gè)Uri,可以利用它來(lái)寫(xiě)入圖像文件的二進(jìn)制數(shù)據(jù)。在當(dāng)前情況下,由于正處于CameraActivity中,因此我們希望簡(jiǎn)單地將它作為觸發(fā)Camera應(yīng)用程序的意圖中的一個(gè)附加值來(lái)傳遞。
Uri imageFileUri = getContentResolver().insert(
Media.EXTERNAL_CONTENT_URI, new ContentValues());
Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageFileUri);
startActivityForResult(i, CAMERA_RESULT);
您將注意到我們也傳入一個(gè)新的ContentValues對(duì)象。該ContentValues對(duì)象是我們希望在記錄創(chuàng)建時(shí)與它相關(guān)聯(lián)的元數(shù)據(jù)。前面的示例則是傳入一個(gè)空的ContentValues對(duì)象。
1. 預(yù)填充關(guān)聯(lián)元數(shù)據(jù)
如果想要預(yù)填充元數(shù)據(jù),那么可以使用put方法為它添加一些數(shù)據(jù)。ContentValues的數(shù)據(jù)形式是名-值對(duì)。其中,名稱(chēng)是標(biāo)準(zhǔn)的,定義為android.provider. MediaStore.Images.Media類(lèi)中的常量(一些常量實(shí)際上位于android.provider.MediaStore. MediaColumns接口中,由Media 類(lèi)實(shí)現(xiàn)該接口)。
// 在ContentValues 映射中保存圖像的名稱(chēng)和描述
ContentValues contentValues = new ContentValues(3);
contentValues.put(Media.DISPLAY_NAME, "This is a test title");
contentValues.put(Media.DESCRIPTION, "This is a test description");
contentValues.put(Media.MIME_TYPE, "image/jpeg");
// 添加一條新的記錄,沒(méi)有指定位圖,但設(shè)置了一些值
// insert()返回新記錄的Uri
Uri imageFileUri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI,
contentValues);
同樣,這個(gè)調(diào)用返回的是一個(gè)Uri,可以通過(guò)意圖將它傳遞給Camera應(yīng)用程序,以指定該圖像應(yīng)該保存的位置。
如果通過(guò)Log命令輸出這個(gè)Uri,那么它看起來(lái)應(yīng)該如下所示: