在我們的布局XML (layout/main.xml)文件中,有一個(gè)ImageView對(duì)象。ImageView是泛型視圖的擴(kuò)展,其支持圖像的顯示。由于我們有一個(gè)帶有指定ReturnedImageView編號(hào)(id)的ImageView對(duì)象,因此需要在活動(dòng)中獲得它的引用,并通過(guò)setImageBitmap方法將它的Bitmap對(duì)象設(shè)置為返回的圖像。這將使得應(yīng)用程序用戶能夠查看這幅捕獲的圖像。
為了獲得ImageView對(duì)象的引用,使用在Activity類中指定的標(biāo)準(zhǔn)方法findViewById。該方法使得我們能夠以編程方式引用在布局XML文件中指定的元素,我們正在通過(guò)將元素id傳遞給setContentView來(lái)使用該布局XML文件。上述示例在XML中以如下方式指定ImageView對(duì)象:
<ImageView android:id="@+id/ReturnedImageView" android:layout_width=
"wrap_content" android:layout_height="wrap_content"></ImageView>
為了引用ImageView并通知它顯示來(lái)自Camera的Bitmap對(duì)象,使用以下代碼。
imv = (ImageView) findViewById(R.id.ReturnedImageView);
imv.setImageBitmap(bmp);
當(dāng)運(yùn)行這個(gè)示例時(shí),您可能會(huì)注意到結(jié)果圖像很小(在我的手機(jī)上,它的寬為121像素,高為162像素。其他設(shè)備會(huì)具有不同的默認(rèn)大小)。這不是一個(gè)bug——相反,它是經(jīng)過(guò)精心設(shè)計(jì)的。當(dāng)通過(guò)一個(gè)意圖觸發(fā)時(shí),Camera應(yīng)用程序不會(huì)將全尺寸的圖像返回給主調(diào)活動(dòng)。通常,這樣做需要大量的內(nèi)存,而移動(dòng)設(shè)備一般會(huì)在內(nèi)存方面受限。相反,Camera應(yīng)用程序?qū)⒃诜祷氐囊鈭D中返回一幅很小的縮略圖,如圖1-2所示。
為了繞過(guò)大小限制,從Android 1.5開(kāi)始,在大多數(shù)設(shè)備上可以將一個(gè)附加值傳遞給觸發(fā)Camera應(yīng)用程序的意圖。這個(gè)附加值的名稱在MediaStore類中指定,它是一個(gè)常量,稱為EXTRA_OUTPUT。這個(gè)附加值(采用名-值對(duì)的形式)將以URI的方式指示Camera應(yīng)用程序您想要將捕獲的圖像保存在什么位置。
以下代碼片段指示Camera應(yīng)用程序應(yīng)該將圖像保存到設(shè)備的SD卡上,文件名為myfavoritepicture.jpg。
String imageFilePath = Environment.getExternalStorageDirectory()
.getAbsolutePath() + "/myfavoritepicture.jpg";
File imageFile = new File(imageFilePath);
Uri imageFileUri = Uri.fromFile(imageFile);
Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageFileUri);
startActivityForResult(i, CAMERA_RESULT);
注意:上述為圖像文件創(chuàng)建URI 的代碼片段可以簡(jiǎn)化為下列形式:
imageFileUri = Uri.parse("file:///sdcard/myfavoritepicture.jpg");
然而在實(shí)踐中,使用以上所示的方法將會(huì)使得代碼更加具有設(shè)備獨(dú)立性,并且對(duì)于SD卡的命名約定或本地文件系統(tǒng)的URI語(yǔ)法變化具有更好的適應(yīng)性。