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) 编辑 收藏 举报