11.2 添加视频元数据

摘要:
如第9章所述,除了先前查看的图像、音频文件和元数据部分外,Android的MediaStore内容提供商还为视频提供了一个特殊部分:MediaStore。视频要添加其他元数据,可以使用返回的URI更新MediaStore中的视频记录。ContentValues对象包含名称/值对,其中名称是MediaStore.Video.1ContentValuesvalues=newContentValues的特定列名;2值.put;3intresult=getContentResolver().update;以下是上述VideoCaptureIntent示例的更新,允许用户将标题与新捕获的视频相关联。1包com.nthm.androidtestActivity;23importcom.nthm.androidtest.R;4重要应用程序活动;5 importantroid.content.ContentValues;6重要内容内容;7 importandroid.net.Uri;8importandroid.os.Bundle;9 importandroid.provider.MediaStore;10importandroid.view.view;11importandroid.view.view.OnClickListener;12 importandroid.widget.Button;13 importandroid.widget.EditText;1415publicclassVideoCaptureIntentextendsActivityimplementsOnClickListener{16publicstaticintVIDEO_CAPTURE=1;17privateButtoncaptureVideoButton;18privateButton播放VideoButton;19privateButntosaveVideoButton;在此版本中,将有一个EditText对象,允许用户输入视频标题。

    正如在第9章所讨论的那样,除了之前查看的用于图像和音频文件以及元数据的部分之外,Android的MediaStore内容提供器还有一个专门用于视频的部分:MediaStore.Video。

    当通过意图触发Camera应用程序时,返回的新录制视频文件的Uri是一个content://样式的URI,它用于与内容提供器组合使用——在当前情况下是MediaStore。为了添加额外的元数据,可以使用返回的URI来更新在MediaStore中的视频记录。

    像任何内容提供器一样,可以使用从上下文中获得的ContentResolver对象上的update方法,同时传入content://样式的URI以及ContentValues对象形式的新数据。因为已经有一个指向特定记录的URI,所以不需要为最后两个参数——SQL样式的WHERE子句以及WHERE子句参数——指定任何内容。

   ContentValues对象包含名/值对,其中名称是MediaStore.Video的特定列名。可能的名称作为MediaStore.Video.Media中的常量列出,其中大多数都继承自android.provider.BaseColumn、MediaStore.MediaColumn以及MediaStore.Video.videoColumn。

1             ContentValues values=new ContentValues(1);
2             values.put(MediaStore.MediaColumns.TITLE, titleEditText.getText().toString().trim());
3             int result=getContentResolver().update(videoFileUri, values, null, null);

    下面是上述VideoCaptureIntent示例的更新,它允许用户将一个标题与新捕获的视频相关联。

 1 package com.nthm.androidtestActivity;
 2 
 3 import com.nthm.androidtest.R;
 4 import android.app.Activity;
 5 import android.content.ContentValues;
 6 import android.content.Intent;
 7 import android.net.Uri;
 8 import android.os.Bundle;
 9 import android.provider.MediaStore;
10 import android.view.View;
11 import android.view.View.OnClickListener;
12 import android.widget.Button;
13 import android.widget.EditText;
14 
15 public class VideoCaptureIntent extends Activity implements OnClickListener {
16     public static int VIDEO_CAPTURE=1;
17     private Button captureVideoButton;
18     private Button playVideoButton;
19     private Button saveVideoButton;

    在这个版本中会有一个EditText对象,允许用户输入视频的标题。

1     private EditText titleEditText;
2     private Uri videoFileUri;
3     @Override
4     protected void onCreate(Bundle savedInstanceState) {
5         super.onCreate(savedInstanceState);
6         setContentView(R.layout.videocaptureitent);
7         captureVideoButton=(Button) findViewById(R.id.CaptureVideoButton);
8         playVideoButton=(Button) findViewById(R.id.PlayVideoButton);

    还将有一个saveVideoButton按钮,当按下该按钮时将触发在MediaStore中更新记录的过程。

 1         saveVideoButton=(Button) findViewById(R.id.SaveVideoButton);
 2         titleEditText=(EditText) findViewById(R.id.TitleEditText);
 3         
 4         playVideoButton.setOnClickListener(this);
 5         captureVideoButton.setOnClickListener(this);
 6         saveVideoButton.setOnClickListener(this);
 7         
 8         playVideoButton.setEnabled(false);
 9         saveVideoButton.setEnabled(false);
10         titleEditText.setEnabled(false);
11     }

    当按下任何按钮时都会触发的onClick方法将执行大部分的工作。当按下captureVideoButton时,将通过意图触发内置的Camera应用程序。当按下playVideoButton时,将通过意图触发内置的媒体播放器应用程序(而不是与之前一样使用的VideoView)。最后,当按下saveVideoButton时,更新视频文件的MediaStore记录。

1     @Override
2     public void onClick(View v) {
3         if(v==captureVideoButton){
4             Intent captureVideoIntent=new Intent(android.provider.MediaStore.ACTION_VIDEO_CAPTURE);
5             startActivityForResult(captureVideoIntent, VIDEO_CAPTURE);
6         }else if(v==playVideoButton){
7             Intent playVideoIntent=new Intent(Intent.ACTION_VIEW, videoFileUri);
8             startActivity(playVideoIntent);
9         }else if(v==saveVideoButton){

    首先,创建一个ContentValues对象,并以用户在EditText对象中指定的文本对他进行填充。

1             ContentValues values=new ContentValues(1);
2             values.put(MediaStore.MediaColumns.TITLE, titleEditText.getText().toString());

    然后,调用ContentResolver对象上的update方法,并传入所捕获的视频的Uri和ContentValues对象。

 1             int result=getContentResolver().update(videoFileUri, values, null, null);
 2             if(result==1){
 3                 //成功
 4             }else{
 5                 //失败
 6             }
 7         }
 8     }
 9 
10     @Override
11     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
12         super.onActivityResult(requestCode, resultCode, data);
13         if(resultCode==RESULT_OK&&requestCode==VIDEO_CAPTURE){
14             videoFileUri=data.getData();
15             playVideoButton.setEnabled(true);
16             saveVideoButton.setEnabled(true);
17             titleEditText.setEnabled(true);
18         }
19     }
20 }

    下面是由上述活动引用的布局XML。

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     android:layout_width="match_parent"
 3     android:layout_height="match_parent"
 4     android:orientation="vertical"
 5     >
 6  <Button 
 7      android:layout_width="wrap_content"
 8      android:layout_height="wrap_content"
 9      android: 
10      android:text="Capture Video"/>
11  <Button 
12      android:layout_width="wrap_content"
13      android:layout_height="wrap_content"
14      android: 
15      android:text="Play Video"/>
16  <TextView 
17      android: 
18      android:layout_width="wrap_content"
19      android:layout_height="wrap_content"
20      android:text="Title:"/>
21  <EditText 
22      android: 
23      android:layout_width="wrap_content"
24      android:layout_height="wrap_content"
25      android:text=""/>
26  <Button 
27      android:layout_width="wrap_content"
28      android:layout_height="wrap_content"
29      android: 
30      android:text="Save Metadata"/>
31 </LinearLayout>

     之前的示例表明在Android中使用视频的许多方面非常的简单,尤其是在使用意图进行视频捕获和依靠MediaStore处理元数据时。

     应该注意的是,当在MediaStore中更新元数据时,不会更细视频文件本身的数据,相反,它只是更新在MediaStore中关于该视频的记录。Android SDK不提供内置的类来直接修改媒体文件的元数据。

   

免责声明:文章转载自《11.2 添加视频元数据》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇数据库插入超时问题的一个原因和解决方案小程序调用相册和相机功能下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Hadoop学习之路(二)HDFS基础

1.HDFS前言 HDFS:Hadoop Distributed File System,Hadoop分布式文件系统,主要用来解决海量数据的存储问题。 设计思想 分散均匀存储 dfs.blocksize = 128M 备份冗余存储 dfs.replication = 3 在大数据系统中作用 为各类分布式运算框架(如:MapReduce,spark,hi...

将Mongodb的表导入到Hive中

1.官方文档:https://docs.mongodb.com/ecosystem/tools/hadoop/ 2.Hive介绍:   Hive特点:     1.hive是一个数据仓库,和oracle,mysql等数据仓库相比,它底层依赖于hdfs。   2.hive是sql解析引擎,将sql语句转换成Map/Reduce任务,然后在hadoop hdf...

如何设计实时数据平台(技术篇)

  敏捷之歌 我抽数故我存在 | DBus 人人玩转流处理 | Wormhole 就当吾是数据库 | Moonbox 颜值最后十公里 | Davinci 导读:实时数据平台(RTDP,Real-time Data Platform)是一个重要且常见的大数据基础设施平台。在上篇(设计篇)中,我们从现代数仓架构角度和典型数据处理角度介绍了RTDP,并探讨了...

.NET、NET Framewor以及.NET Core的关系(二)

什么是CLR,.NET虚拟机? 实际上,.NET不仅提供了自动内存管理的支持,他还提供了一些列的如类型安全、应用程序域、异常机制等支持,这些 都被统称为CLR公共语言运行库。 CLR是.NET类型系统的基础,所有的.NET技术都是建立在此之上,熟悉它可以帮助我们更好的理解框架组件的核心、原理。在我们执行托管代码之前,总会先运行这些运行库代码,通过运行库的代...

alluxio2.0特性-预览

项目地址 https://github.com/Alluxio/alluxio/tree/branch-2.0-preview 2.0版本-构思和设计 支持超大规模数据工作负载 Alluxio作为计算和存储之间的数据编排层,使数据移动并且可以跨多个不同的存储系统访问:HDFS,对象存储,网络附加存储,随着时间的推移,Alluxio需要的元数据支持规模 提供...

Hive 元数据库表信息

  Hive 的元数据信息通常存储在关系型数据库中,常用MySQL数据库作为元数据库管理。 1. 版本表   i) VERSION   -- 查询版本信息 2. 数据库、文件存储相关   i) DBS     -- 存储Hive中所有数据库的基本信息   ii) SDS    -- 存储Hive中文件存储的基本信息      3. 表、视图相关   i) ...