这里主要是针对Ophone进行介绍的,当然 结合了android的源码(以下出现均为android2.2源码)。
首先在Ophone中也是通过android.hardware.Camera类来控制摄像头设备的,要使用只有通过android.hardware.Camera.open()来打开。
try {
mCameraDevice = android.hardware.Camera.open();
} catch (RuntimeException e) {
Log.e(TAG, "fail to connect Camera", e);
throw new CameraHardwareException(e);
}
另外Ophone还提供了一些接口来给予回调,控制Camera的状态,分别是:
1.android.hardware.Camera.ErrorCallback:摄像头出错的时候调用,这个接口具有一个void onError(int error,Camera camera)函数;其中,前者表示数据类型,取值是Camera类中的常量CAMERA_ERROR_UNKNOWN或者是CAMERA_ERROR_SERVICE_DIED;前者是不明错误,后者是表示服务已经关闭,在这种情况下需要释放当前的Camera对象,然后再初始化一个。
private static final class ErrorCallback implements
android.hardware.Camera.ErrorCallback {
public void onError(int error, android.hardware.Camera camera) {
if (error == android.hardware.Camera.CAMERA_ERROR_SERVER_DIED) {
mMediaServerDied = true;
Log.v(TAG, "media server died");
}
}
}
2.android.hardware.camera.PreviewCallback:在图像预览时调用,这个接口有一个void onPreviewFrame(byte[] data,Camera camera);参数data为每帧图像的数据流。我们可以根据实际需要来实现这个接口。
3.android.hardware.Camera.ShutterCallback:在图像预览的时候调用,这个接口具有一个void onShutter();可以在改函数中通知用户快门已经关闭,例如播放一个声音。
private final class ShutterCallback implements
android.hardware.Camera.ShutterCallback {
public void onShutter() {
mShutterCallbackTime = System.currentTimeMillis();
mShutterLag = mShutterCallbackTime - mCaptureStartTime;
Log.v(TAG, "mShutterLag = " + mShutterLag + "ms");
clearFocusState();
}
}
4.android.hardware.Camera.PictureCallback:当拍摄相片的时候调用,该接口具有一个void onPictureTaken(byte[] data,Camera camera)函数;参数和预览的一样。在android中主要有三个类实现了这个接口,分别是PostViewPictureCallback、RawPictureCallback、JepgPictureCallback。我们可以根据需要定义自己需要的类。
5.android.hardware.Camera.AutoFocusCallback:当自动对焦时候调用,该接口具有一个void onAutoFocus(boolean focused,Camera camera)函数;
private final class AutoFocusCallback implements
android.hardware.Camera.AutoFocusCallback {
public void onAutoFocus(boolean focused, android.hardware.Camera camera) {
mFocusCallbackTime = System.currentTimeMillis();
mAutoFocusTime = mFocusCallbackTime - mFocusStartTime;
Log.v(TAG, "mAutoFocusTime = " + mAutoFocusTime + "ms");
if (mFocusState == FOCUSING_SNAP_ON_FINISH) {
// Take the picture no matter focus succeeds or fails. No need
// to play the AF sound if we're about to play the shutter
// sound.
if (focused) {
mFocusState = FOCUS_SUCCESS;
} else {
mFocusState = FOCUS_FAIL;
}
mImageCapture.onSnap();
} else if (mFocusState == FOCUSING) {
// User is half-pressing the focus key. Play the focus tone.
// Do not take the picture now.
ToneGenerator tg = mFocusToneGenerator;
if (tg != null) {
tg.startTone(ToneGenerator.TONE_PROP_BEEP2);
}
if (focused) {
mFocusState = FOCUS_SUCCESS;
} else {
mFocusState = FOCUS_FAIL;
}
} else if (mFocusState == FOCUS_NOT_STARTED) {
// User has released the focus key before focus completes.
// Do nothing.
}
updateFocusIndicator();
}
}
6.还提供了放大缩小的监听器android.hardware.Camera.OnZoomChangeListener。
private final class ZoomListener implements
android.hardware.Camera.OnZoomChangeListener {
public void onZoomChange(int value, boolean stopped,
android.hardware.Camera camera) {
Log.v(TAG, "Zoom changed: value=" + value + ". stopped=" + stopped);
mZoomValue = value;
// Keep mParameters up to date. We do not getParameter again in
// takePicture. If we do not do this, wrong zoom value will be set.
mParameters.setZoom(value);
// We only care if the zoom is stopped. mZooming is set to true when
// we start smooth zoom.
if (stopped && mZoomState != ZOOM_STOPPED) {
if (value != mTargetZoomValue) {
mCameraDevice.startSmoothZoom(mTargetZoomValue);
mZoomState = ZOOM_START;
} else {
mZoomState = ZOOM_STOPPED;
}
}
}
}
当取得照片的数据流后可以通过BitmapFactory的decodeByteArray()函数来解析图片。
另外还可以通过Camera对象的getParameters()函数来得到一个android.hardware.Camera.Parameters对象,Parameters提供了一些接口来设置Camera的属性:
1.setPictureFormat(int pixel_format):设置图片的格式,其取值为PixelFormat YCbCr_420_SP、PixelFormatRGB_565或者PixelFormatJPEG。
2.setPreviewFormat(int pixel_format):设置图片的预览格式,取值如上。
3.setPictureSize(int width,int height):设置图片的高度和宽度,单位为像素。
4.setPreviewSize(int width,int height):设置预览的高度和宽度,取值如上。
5.setPreviewFrameRate(int fps):设置图片预览的帧速。
在设置好Camera的参数后,可以通过函数void startPreview()开始预览图像、void stopPreview()结束预览,通过autoFocus(AutoFocusCallback cb)来自动对焦,最后可以通过takePicture(ShutterCallback shutter, PictureCallback raw, PictureCallback jpeg)函数来拍照。该函数有三个参数,分别为快门回调接口、原生图像数据接口和压缩格式图片数据接口。如果数据格式不存在的话数据流为空,如果不需要实现这些接口则这些参数取值可以为null。
参考:http://www.ophonesdn.com/article/show/144
分享到:
相关推荐
这个“android Camera源码(可用)”项目提供了一套已经修改过的源代码,据描述表明它可以直接运行并且没有错误,这对于开发者来说是一个宝贵的资源,特别是对于那些在实际应用中遇到Camera API问题的人来说。...
通过分析Android 5.0 Camera源码,我们可以深入了解相机服务的工作原理,优化应用性能,实现更精细的图像处理和更丰富的用户体验。同时,理解源码有助于开发者在遇到问题时快速定位并解决问题。
本篇将围绕"Android应用源码基于android2"这个主题,针对Android 2.x版本(特别是Android 2.3.5)的应用开发进行探讨,主要关注Android手电筒开发源码,来揭示Android应用开发的核心技术和关键知识点。 1. Android ...
【Android 源码分析:让 Camera 在 Android 4.0 系统上运行】 在 Android 开发中,Camera 模块是至关重要的部分,它允许应用程序捕获图像和视频。Android 4.0(API 级别 14)是 Android 平台的一个重要里程碑,引入...
这个名为"Android应用源码之camera应用,修改过可以在4.0系统上运行。_camera.zip"的资源提供了一个经过优化,能在Android 4.0(Ice Cream Sandwich)系统上运行的相机应用源代码。这个源码可以帮助开发者深入了解...
在Android平台上,通过...通过学习这个项目,开发者可以掌握Android摄像头应用开发、图像处理和生物信号分析的基础知识,进一步拓展到更复杂的生物识别和健康监测应用。这个源码实例为探索此类技术提供了很好的起点。
在Android平台上,Camera应用是设备的核心功能之一,它允许用户捕获照片和录制视频。这份“Android应用源码之camera应用,修改过可以在4.0...通过分析源码,可以提升Android应用开发的能力,特别是对于相机功能的实现。
本资源“Android_camera源码.zip”包含了Android相机功能的源代码,这对于理解其工作原理、进行自定义相机应用开发或者优化现有相机功能具有重要意义。我们将探讨Android相机源码中的关键组件、工作流程以及如何利用...
这个"Android应用源码之基于Android2.2照相机Demo"是一个适用于开发者学习如何在Android 2.2(API级别8)及更高版本中使用相机功能的实例。下面将详细介绍这个Demo中的关键知识点。 1. **相机权限**: 在Android ...
通过对"testCarema"源码的深入学习和分析,开发者可以更好地理解和掌握Android相机应用的开发流程,从而创建出满足特定需求的自定义相机应用。同时,这也是一个提升自己在Android多媒体编程技能的好机会。
本项目"Camera_face"是一个Android应用源码,专注于实现基于摄像头的人脸检测和识别。通过分析这个源码,我们可以深入理解Android相机API的使用以及人脸识别技术的实现原理。 1. **Android相机API的使用** Android...