图像存储和元数据(1)

为了获得存储图像的标准位置,首先需要获取MediaStore的引用。为此,使用一个内容解析器。内容解析器是用于访问内容提供器(例如MediaStore)的方法。

通过传递一个特定的Uri,内容解析器将提供一个MediaStore接口作为内容提供器。由于是插入一幅新图像,因此我们使用的方法是insert,并且应该使用的Uri将包含在android. provider.MediaStore.Images.Media类的常量EXTERNAL_CONTENT_URI中。这意味着我们想要将图像存储在设备的主要外部存储器上(一般是SD卡)。反之,如果想要将它存储在设备的内存中,那么可以使用INTERNAL_CONTENT_URI。然而,对于存储如图像、音频、视频等大小可能会相当大的媒体,通常需要使用EXTERNAL_CONTENT_URI。

前面显示的插入调用返回一个Uri,可以利用它来写入图像文件的二进制数据。在当前情况下,由于正处于CameraActivity中,因此我们希望简单地将它作为触发Camera应用程序的意图中的一个附加值来传递。

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对象是我们希望在记录创建时与它相关联的元数据。前面的示例则是传入一个空的ContentValues对象。

1. 预填充关联元数据

如果想要预填充元数据,那么可以使用put方法为它添加一些数据。ContentValues的数据形式是名-值对。其中,名称是标准的,定义为android.provider. MediaStore.Images.Media类中的常量(一些常量实际上位于android.provider.MediaStore. MediaColumns接口中,由Media 类实现该接口)。

// 在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");

// 添加一条新的记录,没有指定位图,但设置了一些值

// insert()返回新记录的Uri

Uri imageFileUri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI,

contentValues);

同样,这个调用返回的是一个Uri,可以通过意图将它传递给Camera应用程序,以指定该图像应该保存的位置。

如果通过Log命令输出这个Uri,那么它看起来应该如下所示:

读书导航