1.2.1 获得图像的Uri

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

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

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

1         Uri imageFileUri=getContentResolver().insert(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new ContentValues());
2         Intent i=new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
3         i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageFileUri);
4         startActivityForResult(i, CAMERA_RESULT);

   你将注意到我们也传入一个新的ContentValues对象,该ContentValues对象使我们希望在记录创建时与它相关联的元数据。前面的示例则是传入一个而空的ContentValues对象。

    1.预填充关联元数据

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

1         //在ContentValues影射中保存图像的名称和描述
2         ContentValues contentValues=new ContentValues(3);
3         contentValues.put(android.provider.MediaStore.Images.Media.DISPLAY_NAME, "this is a test title");
4         contentValues.put(android.provider.MediaStore.Images.Media.DESCRIPTION, "this is a test description");
5         contentValues.put(android.provider.MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
6         //添加一条新的记录,没有指定位图,但设置了一些值
7         //insert()返回记录的Uri
8         Uri imageFileUri=getContentResolver().insert(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);

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

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

1         content://media/external/images/media/16

    你可能注意到的第一件事是他看上去像普通的URL,正如在Web浏览器中所使用的一样;但是,它不是以类似http(传输网页的协议)的字符串开始的,而是以content作为开始。在Android中,当一个Uri以content开始时,他将由内容提供器(如MediaStore)使用。
    2.检索保存的图像

     对于之前所获得的用来保存图像的相同Uri,同样可以将其用于访问该图像。无需将该文件的完整路径传递给BitmapFactory,相反,我们可以通过内容解析器为图像打开一个InputStream,并将它传递给BitmapFactory。

1         Bitmap bmp=BitmapFactory.decodeStream(getContentResolver().openInputStream(imageFileUri),null,bmpBitmapFactoryOptions);

    3.后期添加元数据

    在将图像捕获到MediaStore中之后,如果希望将图像与更多的元数据关联,那么可以使用内容解析器的update方法,除了现在直接使用其Uri访问图像文件之外,它与之前所用的insert方法非常的类似。

 

1         //更新记录的标题和描述
2         ContentValues contentValues=new ContentValues(3);
3         contentValues.put(android.provider.MediaStore.Images.Media.DISPLAY_NAME, "this is a test title");
4         contentValues.put(android.provider.MediaStore.Images.Media.DESCRIPTION, "this is a test description");
5         getContentResolver().update(imageFileUri, contentValues, null, null);

 

posted on 2014-08-20 14:17  宁静致远,一览众山小  阅读(505)  评论(0编辑  收藏  举报

导航