• 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应用程序中可用的控制,那么使用意图来触发它将非常有效。

  • 相关阅读:
    jvm理论-运行时数据区
    java nio-理解同步、异步,阻塞和非阻塞
    真正的mybatis_redis二级缓存
    扩展 DbUtility (1)
    DbUtility v3 背后的故事
    DbUtility v3
    Jumony Core 3,真正的HTML引擎,正式版发布
    新项目,WebTest
    面试经验总结,每个求职者应该具有的职业素养
    mkdir()提示No such file or directory错误的解决方法
  • 原文地址:https://www.cnblogs.com/ZSS-Android/p/3958188.html
Copyright © 2020-2023  润新知