这节课主要讲述怎样利用设备已安装的相机应用程序来进行视频捕捉。
假如您的应用中有一个功能是视频整合,但是您又不想编写太复杂的代码来自己控制相机的视频捕捉,幸好,大多数Android设备已至少安装有一个相机程序,本课程就教您怎么样利用设备自带的相机应用来拍摄视频。
申请相机权限
如果您的应用的基本功能就是拍照或拍摄视频,需要在Android Market 中进行可见性限制,只有拥有摄像头的设备才能浏览和下载您的应用程序,那么您需要在manifest 文件的< uses-feature > tag中加入权限限制。
<manifest ... > <uses-feature android:name="android.hardware.camera" /> ... </manifest ... >
如果您的应用在设备没有相机的情况下仍能正常工作,那么可以在该tag中加入android:required="false"。设定以后,所有的设备不管有没有摄像头都可以在Android Market 上面浏览和下载您的应用。但是,您需要自己在运行时检测设备是否有摄像头,调用方法hasSystemFeature(PackageManager.FEATURE_CAMERA)即可,如果相机不可用,那么您就需要禁用应用中与拍照或拍摄视频有关的功能模块。
用相机录制视频
在Andriod系统中,您的应用要委托其他的应用帮忙完成一些工作,可以使用Intent,把期望完成的任务和参数列表设置到Intent中,然后通过系统广播出去,最后当其他应用完成工作的时候,您的应用可以收到一个反馈信息,在回调函数中就可以取得任务处理结果。调用相机程序录制视频的过程与上面描述的类似,有三个关注点,定义拍摄视频的 Intent,启动其他相机应用Activity,处理拍摄后的视频流数据。
示例代码,启动视频录制应用
private void dispatchTakeVideoIntent() { Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); startActivityForResult(takeVideoIntent, ACTION_TAKE_VIDEO); }
一个好的习惯是,在调用上面的代码前首先检查设备中是否有内置相机应用程序可以处理您的请求,示例代码如下:
public static boolean isIntentAvailable(Context context, String action) { final PackageManager packageManager = context.getPackageManager(); final Intent intent = new Intent(action); List<ResolveInfo> list = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); return list.size() > 0; }
查看视频
捕获的视频流数据会通过回调函数onactivityresult()返回到您的应用中,您可以从 Intent中获得该视频数据的Uri地址,示例代码展示了如何将捕获到的视频数据显示在VideoView界面中。
private void handleCameraVideo(Intent intent) { mVideoUri = intent.getData(); mVideoView.setVideoURI(mVideoUri); }
参考文摘:
http://developer.android.com/training/camera/videobasics.html