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