Android2.2平台上支持多camera(一)
2016-07-12 17:33
344 查看
http://blog.csdn.net/wxzking/article/details/6225143
Android2.2及其以前的版本都不支持多camera。Android2.3中,camera的硬件接口中增加了对多camera的支持。由于某些原因,不能直接移植Android2.3,但又要支持多camera,所以只能参考Android2.3版本,在2.2上添加接口,支持多camera。
接下来,我将从application层开始,贯穿framework,直到hardware层,逐层介绍如何去支持多camera。
一、Application层支持多camera
1、camera.Java文件
首先是Packages/apps/camera/src/com/Android/camera/camera.java文件,它是camera应用程序的主体。另外在Framework/base/core/java/android/hardware/下也有一个camera.java文件,它应该是framework与application之间的接口文件。请不要将这两个文件混淆。在application的camera.java中,我添加如下的code。
Import了一个新类,叫做CameraInfo,用它来存储camera的信息,其定义在文件Framework/base/core/java/android/hardware/camera.java中。
CODE:
import android.hardware.Camera.CameraInfo;
增加两个私有变量,CODE如下:
// multiple cameras support
private int mNumberOfCameras;
private int mCameraId;
mNumberOfCameras用来记录手机上camera的数量,可以通过函数CameraHolder.instance().getNumberOfCameras()来获得;mCameraId用来记录某个camera的ID,camera的ID可以从CameraInfo中获取。
当我们获取了camera的总数后,可以通过函数CameraHolder.instance().getCameraInfo(),逐个去获取每个camera的信息,选择自己想要的camera,然后通过函数CameraHolder.instance().setCameraId()去设置当前要用的camera。
这里需要说明的是,在Android2.3中,只增加了getNumberOfCameras()和getCameraInfo()这两个接口,同时修改了CameraHolder.instance().open()接口,该接口对应底层的connect()。我为了坚持Android2.2的所有接口不变的原则,只移植了这两个接口,没有修改connect(),但同时增加了另一个接口setCameraId()。通过setCameraId()告诉camera的HAL层,当前所要的camera,如果不调用该接口,系统就按照Android2.2原来的配置运行。好了,下面我们继续描述code。
我修改了onCreate()函数,CODE如下:
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.camera);
mSurfaceView = (SurfaceView) findViewById(R.id.camera_preview);
mPreferences = PreferenceManager.getDefaultSharedPreferences(this);
CameraSettings.upgradePreferences(mPreferences);
mNumberOfCameras = CameraHolder.instance().getNumberOfCameras();
for(int I = 0; I < mNumberOfCameras; I++)
{
CameraInfo info = CameraHolder.instance().getCameraInfo()[I];
If(CameraInfo.CAMERA_FACING_FRONT == info.facing)
{
mCameraId = I;
break;
}
}
CameraHolder.instance().setCameraId(mCameraId);
mQuickCapture = getQuickCaptureSettings();
……
至此Packages/apps/camera/src/com/android/camera/camera.java文件修改完毕,接下来我们修改Packages/apps/camera/src/com/android/camera/CameraHolder.java。camera.java是通过调用CameraHolder.java的接口来实现功能的。
2、CameraHolder.java文件
在CameraHolder.java文件中,同样得import CameraInfo类。CODE如下:
import android.hardware.Camera.CameraInfo;
添加三个私有变量:
private int mNumberOfCameras;
private int mCameraId = -1;
private CameraInfo[] mInfo;
这三个变量的意义一目了然,不做多讲。
修改了CameraHolder()函数:
private CameraHolder() {
HandlerThread ht = new HandlerThread("CameraHolder");
ht.start();
mHandler = new MyHandler(ht.getLooper());
mNumberOfCameras = android.hardware.Camera.getNumberOfCameras();
mInfo = new CameraInfo[mNumberOfCameras];
for (int i = 0; i < mNumberOfCameras; i++) {
mInfo[i] = new CameraInfo();
android.hardware.Camera.getCameraInfo(i, mInfo[i]);
}
}
CameraHolder()中调用android.hardware.Camera.getNumberOfCameras()获取了camera的总数,赋值给mNumberOfCameras,同时创建了相应数目的CameraInfo数组,并通过函数android.hardware.Camera.getCameraInfo()将camera的信息都存储在mInfo中。同时增加了下面三个接口函数:
public int getNumberOfCameras() {
return mNumberOfCameras;
}
public CameraInfo[] getCameraInfo() {
return mInfo;
}
public int setCameraId(int cameraId) {
return android.hardware.Camera.setCameraId(cameraId);
}
在application中,修改上述两个文件即可。下面我们将描述framework中的修改。
Android2.2及其以前的版本都不支持多camera。Android2.3中,camera的硬件接口中增加了对多camera的支持。由于某些原因,不能直接移植Android2.3,但又要支持多camera,所以只能参考Android2.3版本,在2.2上添加接口,支持多camera。
接下来,我将从application层开始,贯穿framework,直到hardware层,逐层介绍如何去支持多camera。
一、Application层支持多camera
1、camera.Java文件
首先是Packages/apps/camera/src/com/Android/camera/camera.java文件,它是camera应用程序的主体。另外在Framework/base/core/java/android/hardware/下也有一个camera.java文件,它应该是framework与application之间的接口文件。请不要将这两个文件混淆。在application的camera.java中,我添加如下的code。
Import了一个新类,叫做CameraInfo,用它来存储camera的信息,其定义在文件Framework/base/core/java/android/hardware/camera.java中。
CODE:
import android.hardware.Camera.CameraInfo;
增加两个私有变量,CODE如下:
// multiple cameras support
private int mNumberOfCameras;
private int mCameraId;
mNumberOfCameras用来记录手机上camera的数量,可以通过函数CameraHolder.instance().getNumberOfCameras()来获得;mCameraId用来记录某个camera的ID,camera的ID可以从CameraInfo中获取。
当我们获取了camera的总数后,可以通过函数CameraHolder.instance().getCameraInfo(),逐个去获取每个camera的信息,选择自己想要的camera,然后通过函数CameraHolder.instance().setCameraId()去设置当前要用的camera。
这里需要说明的是,在Android2.3中,只增加了getNumberOfCameras()和getCameraInfo()这两个接口,同时修改了CameraHolder.instance().open()接口,该接口对应底层的connect()。我为了坚持Android2.2的所有接口不变的原则,只移植了这两个接口,没有修改connect(),但同时增加了另一个接口setCameraId()。通过setCameraId()告诉camera的HAL层,当前所要的camera,如果不调用该接口,系统就按照Android2.2原来的配置运行。好了,下面我们继续描述code。
我修改了onCreate()函数,CODE如下:
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.camera);
mSurfaceView = (SurfaceView) findViewById(R.id.camera_preview);
mPreferences = PreferenceManager.getDefaultSharedPreferences(this);
CameraSettings.upgradePreferences(mPreferences);
mNumberOfCameras = CameraHolder.instance().getNumberOfCameras();
for(int I = 0; I < mNumberOfCameras; I++)
{
CameraInfo info = CameraHolder.instance().getCameraInfo()[I];
If(CameraInfo.CAMERA_FACING_FRONT == info.facing)
{
mCameraId = I;
break;
}
}
CameraHolder.instance().setCameraId(mCameraId);
mQuickCapture = getQuickCaptureSettings();
……
至此Packages/apps/camera/src/com/android/camera/camera.java文件修改完毕,接下来我们修改Packages/apps/camera/src/com/android/camera/CameraHolder.java。camera.java是通过调用CameraHolder.java的接口来实现功能的。
2、CameraHolder.java文件
在CameraHolder.java文件中,同样得import CameraInfo类。CODE如下:
import android.hardware.Camera.CameraInfo;
添加三个私有变量:
private int mNumberOfCameras;
private int mCameraId = -1;
private CameraInfo[] mInfo;
这三个变量的意义一目了然,不做多讲。
修改了CameraHolder()函数:
private CameraHolder() {
HandlerThread ht = new HandlerThread("CameraHolder");
ht.start();
mHandler = new MyHandler(ht.getLooper());
mNumberOfCameras = android.hardware.Camera.getNumberOfCameras();
mInfo = new CameraInfo[mNumberOfCameras];
for (int i = 0; i < mNumberOfCameras; i++) {
mInfo[i] = new CameraInfo();
android.hardware.Camera.getCameraInfo(i, mInfo[i]);
}
}
CameraHolder()中调用android.hardware.Camera.getNumberOfCameras()获取了camera的总数,赋值给mNumberOfCameras,同时创建了相应数目的CameraInfo数组,并通过函数android.hardware.Camera.getCameraInfo()将camera的信息都存储在mInfo中。同时增加了下面三个接口函数:
public int getNumberOfCameras() {
return mNumberOfCameras;
}
public CameraInfo[] getCameraInfo() {
return mInfo;
}
public int setCameraId(int cameraId) {
return android.hardware.Camera.setCameraId(cameraId);
}
在application中,修改上述两个文件即可。下面我们将描述framework中的修改。
相关文章推荐
- Android 开发 RxJava / RxAndroid 详解
- android 调用ZXing包实现二维码预览框图片有拉伸
- Android SDK 目录下的文件夹主要是干什么的
- android中开启子线程
- Android系统移植与平台开发(四) - led HAL简单设计案例分析
- Android系统移植与平台开发(三)- JNI介绍
- Android系统移植与平台开发(二)- HAL Stub框架分析
- Android SharedPreferences的使用
- Android冷启动白屏解析,带你一步步分析和解决问题
- 【Android】viewpager+fragment实现界面滑动,顶部导航也滑动
- Android静态安全检测 -> Broadcast Receiver组件暴露
- Android系统移植与平台开发(一)- 初识HAL
- android事件分发机制知识点
- Android动画完全解析--View动画
- Android BLE中传输数据的最大长度怎么破
- Android布局详解:FrameLayout
- Android View状态保存
- Android学习笔记:使用Intent切换活动
- 安卓SimpleAdapter关于设置图片资源问题
- Android 源码编译详解【二】:VMware12/Ubuntu16 下载、安装图解