11.2 添加视频元数据

    正如在第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:id="@+id/CaptureVideoButton"
10      android:text="Capture Video"/>
11  <Button 
12      android:layout_width="wrap_content"
13      android:layout_height="wrap_content"
14      android:id="@+id/PlayVideoButton"
15      android:text="Play Video"/>
16  <TextView 
17      android:id="@+id/TitleTextView"
18      android:layout_width="wrap_content"
19      android:layout_height="wrap_content"
20      android:text="Title:"/>
21  <EditText 
22      android:id="@+id/TitleEditText"
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:id="@+id/SaveVideoButton"
30      android:text="Save Metadata"/>
31 </LinearLayout>

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

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

   

posted on 2014-09-06 09:32  宁静致远,一览众山小  阅读(1039)  评论(0编辑  收藏  举报

导航