这里主要是针对android2.2的
首先,从manifest.xml出发。可以看到:
<activity android:name="com.android.ginwave.camera.Camera"
android:configChanges="orientation|keyboardHidden"
android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
android:screenOrientation="landscape"
android:clearTaskOnLaunch="true"
android:taskAffinity="android.task.camera">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
.
.
.
</activity>
则首先进入的activity是camera.java。
接着我们就主要分析camera这个类。
由于camera代码庞大,所以仅针对需要修改的地方进行分析。
1.如果想处理预览数据,则我们可以在camera中调用setPreviewCallback方法。实现重写onPreviewFrame的方法:
camera.setPreviewCallback(new PreviewCallback(){
public void onPreviewFrame(byte[] _data,Camera _camera){
//增加对数据的处理
}
});
2.拍照的时候,我们调用camera对象的takePicture方法,传递shutterCallback和pictureCallback 实现RAW和JPEG的编码图像。每个图像的回调函数都会得到一个以合适的格式表示图像的字节数组,并且shutter callback会在shutter关闭之后马上触发。
private void takePicture(){
camera.takePicture(shutterCallback,rawCallback,jepgCallback);
}
例如:
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();
}
}
private final class RawPictureCallback implements PictureCallback {
public void onPictureTaken(byte[] rawData,
android.hardware.Camera camera) {// BY ABLE 数据
mRawPictureCallbackTime = System.currentTimeMillis();
Log.v(TAG, "mShutterToRawCallbackTime = "
+ (mRawPictureCallbackTime - mShutterCallbackTime) + "ms");
}
}
在private class ImageCapture内:
mCameraDevice.takePicture(mShutterCallback, mRawPictureCallback,
mPostViewPictureCallback, new JpegPictureCallback(loc));
基本对数据的处理,就是对预览图像和拍照图像的处理。接着介绍下界面的修改:
1.对于相机而言,主要的页面存在于camera.xml中。
这里面有个自定义的布局:PreviewFrameLayout。我们可以在com.android.camera包下找到PreviewFrameLayout.java。它是ViewGroup的扩展类。里面有个FrameLayout/SurfaceView/FocusRectangle,SurfaceView用于显示预览图像、FocusRectangle是用来显示聚焦到拍照完成的那个框框的。
可以在camera.xml中增加layout来显示自己需要的布局,但是相应地PreviewFrameLayout的布局大小要调整。(这里需要注意相机已经设定了程序是横屏执行的,并且屏蔽了转屏的事件),接着就是根据自己的需要来修改或者增加布局了,其中PreviewFrameLayout的位置主要是由
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {...}函数来控制。
2.对于相机右侧的popupwindow的弹出项,可以在array.xml中进行添加。它主要是个PreferenceGroup。点击popupwindow的选项后,在HeadUpDisplay的90行中onSharedPreferencesChanged()->camera:2222->2169->2191->1972->1950->1818.也就是说我们要想对点击事件进行处理只需要对函数updateCameraParametersPreference()进行修改,当然针对改变的CameraSetting我们也要进行修改。
分享到:
相关推荐
Android Camera源码分析可以帮助开发者深入理解如何高效、稳定地实现相机功能,以及如何解决常见问题。在这个项目中,开发者已经修改了包名,使得代码可以直接运行,避免了常见的运行时错误,确保了可用性。 ...
自己总结的Android Camera系统架构及源码分析,以framework和hal为主。
"Open Camera Android 源码 适配Android Studio" 是一个关于开源相机应用 Open Camera 的源代码项目,已经优化为能够在Android Studio环境下进行开发和编译。Open Camera是一款功能丰富的免费相机应用,它允许用户...
本教程将深入探讨如何使用Camera2 API创建一个自定义相机应用,通过分析提供的OneSelfCamera源码,我们可以学习到以下几个关键知识点: 1. **Camera2 API基础**:Camera2 API取代了旧版的Camera API,提供了更多的...
Android Camera系统架构源码分析 Android Camera系统架构源码分析是Android系统中Camera模块的核心组件之一,负责摄像头的图像捕获、处理和存储。下面我们将对Android Camera系统架构源码进行分析,了解其内部机制...