获取图像
一旦你建立了预览类和显示预览类的viewlayout,你就已准备好开始使用你的应用获取图像了.在你的应用代码中,你还必须要建立起那些用于控制的控件们的侦听器,来响应用户的动作.
要取得图像,使用Camera.takePicture()方法.此方法有三个参数.要获得JPEG图像,你必须实现一个Camera.PictureCallback接口来接收图像数据然后写入文件中.下面的代码演示了最基本的Camera.PictureCallback接口的实现.
private PictureCallback mPicture = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);
if (pictureFile == null){
Log.d(TAG, "Error creating media file, check storage permissions: " +
e.getMessage());
return;
}
try {
FileOutputStream fos = new FileOutputStream(pictureFile);
fos.write(data);
fos.close();
} catch (FileNotFoundException e) {
Log.d(TAG, "File not found: " + e.getMessage());
} catch (IOException e) {
Log.d(TAG, "Error accessing file: " + e.getMessage());
}
}
};
通过调用Camera.takePicture()方法触发图像获取事件.下面的代码演示了如了在一个按钮的View.OnClickListener方法中调用此方法.
// 为获取按钮增加一个listener
Button captureButton = (Button) findViewById(id.button_capture);
captureButton.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
// 从相机获取图像
mCamera.takePicture(null, null, mPicture);
}
}
);
注:mPicture成员引用自"使用相机"一节的同名成员变量.
注意:记注在用完时要使用Camera.release()来释放相机对象!关于如何释放相机,见"释放相机"一节.
获取视频
下面这些配置给MediaRecorder的视频录制参数被置为默认值.然而,你可以自己设置这些配置项的值:
使用android框架获取视频需要小心管理相机对象并且与MediaRecorder类做好协调.当使用相机进行录像时,你必须管理好Camera.lock()和Camera.unlock()两个调用以允许MediaRecorder操作相机.
注:从Android4.0 (API level 14)开始,Camera.lock()和Camera.unlock()调用会自动管理.
与从像机获取图像不一样,获取视频需要一个十挑剔的调用顺序.你必须按照特殊的顺序才能成功的准备并获取视频,如下所示:
打开相机 –使用Camera.open()来获取一个相机对象的实例.
连接预览 -通过Camera.setPreviewDisplay()连接一个SurfaceView到相机来准备一个实时预览.
开始预览 –调用Camera.startPreview()来显示实时图像.
-
开始录制视频 –下面的步骤必须完整的执行才能成功的录制视频:
Unlock相机– 调用Camera.unlock()来Unlock相机以供MediaRecorder使用.
-
配置MediaRecorder– 按以下顺序调用MediaRecorder的方法.更多知识请参考MediaRecorder参考文档.
setCamera()- 设置视频获取所使用的相机,使用你的应用的当前的相机实例.
setAudioSource()- 设置音频source,使用MediaRecorder.AudioSource.CAMCORDER.
setVideoSource()- 设置视频source,使用MediaRecorder.VideoSource.CAMERA.
-
设置视频输出的格式和编码.对于Android2.2 (API Level8)及更高版本,使用MediaRecorder.setProfile方法,使用CamcorderProfile.get()来获得一个profile.对于之前的版本,你必须用参数来设置视频输出格式和编码:
setOutputFormat()- 设置输出格式,指定为默认的或MediaRecorder.OutputFormat.MPEG_4.
setAudioEncoder()- 设置音频编码类型,指定为默认的或MediaRecorder.AudioEncoder.AMR_NB.
setVideoEncoder()- 设置视频编码类型,指定为默认的或MediaRecorder.VideoEncoder.MPEG_4_SP.
setOutputFile()-指定输出文件,使用getOutputMediaFile(MEDIA_TYPE_VIDEO).toString(),这个方法是"保存媒体文件"一节(在后面)中的例子代码.
-
setPreviewDisplay()- 为你的应用指定SurfaceView预览layout元素,使用在连接预览时指定的相同对象.
注意:你必须按上面的顺序调用MediaRecorder的配置方法们,否则你的应用将遇到悲剧从而失败.
准备MediaRecorder- 准备MediaRecorder,主要是通过调用配置方法MediaRecorder.prepare().
开始MediaRecorder- 调用MediaRecorder.start()开始录制视频.
-
停止录制视频 –依次调用下面的方法,才能成功结束一个视频录制过程:
停止MediaRecorder– 调用MediaRecorder.stop()停止录制视频.
重置MediaRecorder– 可选的,调用MediaRecorder.reset()可以将以前的配置取消.
释放MediaRecorder– 调用MediaRecorder.release()来释放MediaRecorder.
锁住相机 -调用Camera.lock()锁住相机以使后面的MediaRecorder会话也可以使用相机.从Android4.0 (API level 14)开始,此调用仅在MediaRecorder.prepare()调用失败时才需要.
停止预览 –当你的activity完成了对相机的使用,使用Camera.stopPreview()停止预览.
释放相机- 调用Camera.release()释放相机,以使其它应用也可使用它.
注:不创建相机预览并且略过前几步也是可以使用MediaRecorder.然而,用户一般还是想看预览的,所以此处不讨论这种情况.
技巧:如果你的应用是专为录像写的,那么在启动你的预览之前调用setRecordingHint(boolean)并传入true,这样可以帮你减少启动录制的时间.
配置MediaRecorder
当使用MediaRecorder类来录制视频,你必须按特定步骤执行配置过程,然后调用MediaRecorder.prepare()方法来检查并实现所给予的配置.下面的例子代码演示了如何为视频录制正确的配置并准备MediaRecorder类.
private boolean prepareVideoRecorder(){
mCamera = getCameraInstance();
mMediaRecorder = new MediaRecorder();
// Step 1: 解锁相机并设置给MediaRecorder
mCamera.unlock();
mMediaRecorder.setCamera(mCamera);
// Step 2: 设置sources
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// Step 3: 设置一个CamcorderProfile (在API Level 8或更高版本中)
mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
// Step 4: 设置输出文件
mMediaRecorder.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString());
// Step 5: 设置预览输出
mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());
// Step 6: 准备配置MediaRecorder
try {
mMediaRecorder.prepare();
} catch (IllegalStateException e) {
Log.d(TAG, "IllegalStateException preparing MediaRecorder: " + e.getMessage());
releaseMediaRecorder();
return false;
} catch (IOException e) {
Log.d(TAG, "IOException preparing MediaRecorder: " + e.getMessage());
releaseMediaRecorder();
return false;
}
return true;
}
在Android2.2 (API Level8)之前,你必须直接设置输出格式和编码格式等参数,而不是使用CamcorderProfile.可以像下面这样做:
// Step 3: 设置输出格式和编码(for versions prior to API Level 8)
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
下面这些配置给MediaRecorder的视频录制参数被置为默认值.然而,你可以自己设置这些配置项的值:
·setVideoEncodingBitRate()
·setVideoSize()
·setVideoFrameRate()
·setAudioEncodingBitRate()
·setAudioChannels()
·setAudioSamplingRate()
开始和停止MediaRecorder
当使用MediaRecorder开始和停止录像时,你必须按特定的顺序进行调用,如下所列:
·使用Camera.unlock()解锁相机
·按上面代码所演示的配置MediaRecorder
·MediaRecorder.start()开始录像
·录制视频
·使用MediaRecorder.stop()停止录像
·用MediaRecorder.release()释放MediaRecorder
·用Camera.lock()锁住相机
下面的示例代码演示如何通过一个按钮来使用相机和MediaRecorder类正确的开始和停止视频录制
注:当完成一个视频录制,不要释放相机,否则你的预览将被迫停止.
private boolean isRecording = false;
// 向录像按钮增加监听器
Button captureButton = (Button) findViewById(id.button_capture);
captureButton.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isRecording) {
// 停止录像并释放 MediaRecorder
mMediaRecorder.stop(); // stop the recording
releaseMediaRecorder(); // release the MediaRecorder object
mCamera.lock(); // take camera access back from MediaRecorder
// inform the user that recording has stopped
setCaptureButtonText("Capture");
isRecording = false;
} else {
// 初始化视频相机
if (prepareVideoRecorder()) {
// 相几解锁,MediaRecorder 已准备好.现在可以开始录像了
mMediaRecorder.start();
// inform the user that recording has started
setCaptureButtonText("Stop");
isRecording = true;
} else {
// 准备过程失败,释放相机
releaseMediaRecorder();
// inform user
}
}
}
}
);
注:在上例中,prepareVideoRecorder()方法引用自例子"配置MediaRecorder".此方法解锁相机配置并准备MediaRecorder实例.
分享到:
相关推荐
android多媒体和相机详解十.doc
android多媒体和相机详解十.pdf
android多媒体和相机详解十.doc
《Android多媒体应用开发实战详解:图像、音频、视频、2D和3D》Android凭借其强大的功能逐渐赢得了广大用户和开发者的青睐,已经成为移动开发平台上的翘楚。全书分为17章,分别详细讲解了Android系统基础,深入底层...
第7章 娱乐和多媒体应用 7.1 获取图片的宽和高 7.1.1 实现原理 7.1.2 位图操作的基本知识 7.1.3 具体实现 7.2 绘制几何图形 7.3 手机屏保 7.4 照片拖动效果 7.5 存储卡中的图片 7.6 获取内置媒体文件 7.7 调节音量 ...
何为hal层深入分析,goldfish、msm、map内核和驱动解析,显示系统、输入系统、振动器系统、音频系统、视频输出系统的驱动,openmax多媒体、多媒体插件框架,传感器、照相机、wi-fi、蓝牙、gps和电话系统等。...
《Android应用开发详解》 作者:郭宏志 编著 内容简介 本书分为三个部分,包括基础篇、技术篇和应用篇。由浅入深地讲述了Android应用开发的方方面面。 第一篇 基础篇 第1章 Android概述 Android概述,讲述了...
李骏、陈小玉编著的《Android驱动开发与移植实战详解》分为18章,依次讲解了Android系统的基本知识, Linux内核的基本知识,分析了Android系统的源码,深入分析HAL层的基本知识,GoldFish下的驱动、MSM内核和驱动、...
全书分为21章,依次讲解驱动移植的必要性, Goldfish、OMAP内核和驱动解析,显示系统、输入系统、振动器系统、音频系统、视频输出系统的驱动,OpenMax多媒体和多媒体插件框架,传感器,照相机,Wi-Fi,蓝牙和GPS,...
详细讲解了Android系统中常用驱动的移植知识,分别讲解了显示系统、输入系统、振动器系统、音频系统、视频输出系统、OpenMax多媒体框架、多媒体插件框架、传感器系统、照相机系统、Wi—Fi系统、蓝牙系统、电话系统、...
全书分为21章,依次讲解驱动移植的必要性, Goldfish、OMAP内核和驱动解析,显示系统、输入系统、振动器系统、音频系统、视频输出系统的驱动,OpenMax多媒体和多媒体插件框架,传感器,照相机,Wi-Fi,蓝牙和GPS,...
《Android底层开发技术实战详解:内核、移植和驱动(第2版)》从底层原理开始讲起,结合真实的案例向读者详细介绍了Android内核、移植和驱动开发的整个流程。全书分为21章,依次讲解驱动移植的必要性, Goldfish、...
14.1 Android多媒体插件373 14.2 需要移植的内容374 14.3 opencore引擎375 14.3.1 opencore层次结构375 14.3.2 opencore代码结构376 14.3.3 opencore编译结构377 14.3.4 opencore oscl381 14.3.5 实现...
《Android应用开发揭秘》内容全面,不仅详细讲解了Android框架、Android组件、用户界面开发、游戏开发、数据存储、多媒体开发和网络开发等基础知识,而且还深入阐述了传感器、语音识别、桌面组件开发、Android游戏...
14.1 Android多媒体插件373 14.2 需要移植的内容374 14.3 opencore引擎375 14.3.1 opencore层次结构375 14.3.2 opencore代码结构376 14.3.3 opencore编译结构377 14.3.4 opencore oscl381 14.3.5 实现...