正如之前所讨论的那样,通常执行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应用程序中可用的控制,那么使用意图来触发它将非常有效。