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