• 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);
  • 相关阅读:
    WPF编译时提示"xxx不包含适合于入口点的静态 Main方法xxx"
    被解放的姜戈04 各取所需
    SublimeText3 snippet 编写总结
    安装 Apache 出现 <OS 10013> 以一种访问权限不允许的方式做了一个访问套接字的尝试
    被解放的姜戈03 所谓伊人
    被解放的姜戈02 庄园疑云
    被解放的姜戈01 初试天涯
    EXP-00000: Message 0 not found; No message file for product=RDBMS, facility=EXP问题的解决方案
    Python网络02 Python服务器进化
    Python网络01 原始Python服务器
  • 原文地址:https://www.cnblogs.com/ZSS-Android/p/3924502.html
Copyright © 2020-2023  润新知