Android2.2平台上支持多camera(一)

时间:2022-12-04 09:25:51

Android2.2及其以前的版本都不支持多cameraAndroid2.3中,camera的硬件接口中增加了对多camera的支持。由于某些原因,不能直接移植Android2.3,但又要支持多camera,所以只能参考Android2.3版本,在2.2上添加接口,支持多camera

接下来,我将从application层开始,贯穿framework,直到hardware层,逐层介绍如何去支持多camera

一、Application层支持多camera

1camera.java文件

首先是Packages/apps/camera/src/com/android/camera/camera.java文件,它是camera应用程序的主体。另外在Framework/base/core/java/android/hardware/下也有一个camera.java文件,它应该是frameworkapplication之间的接口文件。请不要将这两个文件混淆。在applicationcamera.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用来记录某个cameraIDcameraID可以从CameraInfo中获取。

当我们获取了camera的总数后,可以通过函数CameraHolder.instance().getCameraInfo(),逐个去获取每个camera的信息,选择自己想要的camera,然后通过函数CameraHolder.instance().setCameraId()去设置当前要用的camera

这里需要说明的是,在Android2.3中,只增加了getNumberOfCameras()getCameraInfo()这两个接口,同时修改了CameraHolder.instance().open()接口,该接口对应底层的connect()。我为了坚持Android2.2的所有接口不变的原则,只移植了这两个接口,没有修改connect(),但同时增加了另一个接口setCameraId()。通过setCameraId()告诉cameraHAL层,当前所要的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.javacamera.java是通过调用CameraHolder.java的接口来实现功能的。

2CameraHolder.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中的修改。