正文

使用内置的Camera应用程序捕获图像(4)

Android多媒体开发高级编程 作者:(美)艾佛瑞


在我们的布局XML (layout/main.xml)文件中,有一个ImageView对象。ImageView是泛型视图的扩展,其支持图像的显示。由于我们有一个带有指定ReturnedImageView编号(id)的ImageView对象,因此需要在活动中获得它的引用,并通过setImageBitmap方法将它的Bitmap对象设置为返回的图像。这将使得应用程序用户能够查看这幅捕获的图像。

为了获得ImageView对象的引用,使用在Activity类中指定的标准方法findViewById。该方法使得我们能够以编程方式引用在布局XML文件中指定的元素,我们正在通过将元素id传递给setContentView来使用该布局XML文件。上述示例在XML中以如下方式指定ImageView对象:

<ImageView android:id="@+id/ReturnedImageView" android:layout_width=

"wrap_content" android:layout_height="wrap_content"></ImageView>

为了引用ImageView并通知它显示来自Camera的Bitmap对象,使用以下代码。

imv = (ImageView) findViewById(R.id.ReturnedImageView);

imv.setImageBitmap(bmp);

当运行这个示例时,您可能会注意到结果图像很小(在我的手机上,它的宽为121像素,高为162像素。其他设备会具有不同的默认大小)。这不是一个bug——相反,它是经过精心设计的。当通过一个意图触发时,Camera应用程序不会将全尺寸的图像返回给主调活动。通常,这样做需要大量的内存,而移动设备一般会在内存方面受限。相反,Camera应用程序将在返回的意图中返回一幅很小的缩略图,如图1-2所示。

为了绕过大小限制,从Android 1.5开始,在大多数设备上可以将一个附加值传递给触发Camera应用程序的意图。这个附加值的名称在MediaStore类中指定,它是一个常量,称为EXTRA_OUTPUT。这个附加值(采用名-值对的形式)将以URI的方式指示Camera应用程序您想要将捕获的图像保存在什么位置。

以下代码片段指示Camera应用程序应该将图像保存到设备的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);

注意:上述为图像文件创建URI 的代码片段可以简化为下列形式:

imageFileUri = Uri.parse("file:///sdcard/myfavoritepicture.jpg");

然而在实践中,使用以上所示的方法将会使得代码更加具有设备独立性,并且对于SD卡的命名约定或本地文件系统的URI语法变化具有更好的适应性。


上一章目录下一章

Copyright © 读书网 www.dushu.com 2005-2020, All Rights Reserved.
鄂ICP备15019699号 鄂公网安备 42010302001612号