您的位置:首页 > 移动开发 > Android开发

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中的修改。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: