11.1 使用意图录制视频

    正如之前所讨论的那样,通常执行Android上某些功能的最快捷和简单的方式是利用现有的应用程序,可以通过应用程序中的一个意图来触发它。通过意图触发内置的Camera应用程序来录制视频也不例外。

    在android.provider.MediaStore类中,存在一个名为ACTION_VIDEO_CAPTURE的常量,其中包含字符串“android.media.action.VIDEO_CAPTURE”。摄像头应用程序将这个字符串注册为一个意图刷选器,因此在意图中通过Content.startActivity或Content.startActivityForResult方法发送该字符串时将会激活它。其他应用程序也可能注册了相同的字符串,这将会使用户获得提示,以选择他或她想使用哪个应用程序来执行该项操作。

1             Intent captureVideoIntent=new Intent(android.provider.MediaStore.ACTION_VIDEO_CAPTURE);
2             startActivityForResult(captureVideoIntent, VIDEO_CAPTURE);

    VIDEO_CAPTURE是一个常量,应该将它定义为一个类变量。当Camera应用程序通过调用onActivityResult方法将一个结果返回给活动时,可以使用该常量确认:

1     public static int VIDEO_CAPTURE=1;

    onActivityResult方法返回给活动的意图(下面代码中的data)中包含了一个视频文件的URI,该文件是由Camera应用程序创建的。

1     @Override
2     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
3         super.onActivityResult(requestCode, resultCode, data);
4         if(resultCode==RESULT_OK&&requestCode==VIDEO_CAPTURE){
5             videoFileUri=data.getData();
6             playVideoButton.setEnabled(true);
7         }
8     }

    下面是使用意图触发内置的Camera应用程序以进行视频捕获的一个完整示例。

 1 package com.nthm.androidtestActivity;
 2 
 3 import com.nthm.androidtest.R;
 4 import android.app.Activity;
 5 import android.content.Intent;
 6 import android.net.Uri;
 7 import android.os.Bundle;
 8 import android.view.View;
 9 import android.view.View.OnClickListener;
10 import android.widget.Button;
11 import android.widget.VideoView;
12 
13 public class VideoCaptureIntent extends Activity implements OnClickListener {

    创建活动的VIDEO_CAPTURE常量,其将在调用onActivityResult时返回。

1     public static int VIDEO_CAPTURE=1;

    活动将使用两个按钮,一个用于触发意图的发送,即captureVideoButton,另一个用于捕获视频后播放他,即playVideoButton。

1     private Button captureVideoButton;
2     private Button playVideoButton;

    我们将使用一个标准的带Uri的VideoView对象来播放已经捕获的视频。

 1     private VideoView videoView;
 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);
 9         playVideoButton.setOnClickListener(this);
10         captureVideoButton.setOnClickListener(this);

     初始时不会启用playVideoButton,即不能单击它。一旦捕获了视频,则将它设置为启用。

1         playVideoButton.setEnabled(false);
2         videoView=(VideoView) findViewById(R.id.VideoView);
3     }

    活动实现了OnClickListener,同时注册为每个按钮的OnClickListener。因此当按下或单击一个按钮时,将调用onClick方法。

1     @Override
2     public void onClick(View v) {
3         if(v==captureVideoButton){

    如果按下captureVideoButton,那么创建意图并连同VIDEO_CAPTURE常量一起将它传递给startActivityForResult方法,这将启动内置的Camera应用程序。

1             Intent captureVideoIntent=new Intent(android.provider.MediaStore.ACTION_VIDEO_CAPTURE);
2             startActivityForResult(captureVideoIntent, VIDEO_CAPTURE);
3         }else if(v==playVideoButton){

    如果单击playVideoButton,那么设置待播放的URI并开始播放。

1             videoView.setVideoURI(videoFileUri);
2             videoView.start();
3         }
4     }

    当Camera应用程序(或任何触发的应用程序/活动)返回时,将调用如下的onActivityResult方法。它将检查resultCode是否为长两个RESULT_OK,以及requestCode是否为入到startActivityForResult的值VIDEO_CAPTURE,然后获取录制的视频文件的Uri。随后将启用playVideoButton,从而用户可以单击它并开始播放视频。

1     @Override
2     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
3         super.onActivityResult(requestCode, resultCode, data);
4         if(resultCode==RESULT_OK&&requestCode==VIDEO_CAPTURE){
5             videoFileUri=data.getData();
6             playVideoButton.setEnabled(true);
7         }
8     }
9 }

    下面是上述活动引用的布局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  <VideoView 
17      android:id="@+id/VideoView"
18      android:layout_width="wrap_content"
19      android:layout_height="wrap_content"/>
20 </LinearLayout>

    如果只须录制视频或希望给用户提供所有在Camera应用程序中可用的控制,那么使用意图来触发它将非常有效。

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

导航