关于camera CTS调试中遇到的问题
最近在调试新项目camera 的cts,在调试过程中遇到了一些问题,写下来总结一下。
问题引子:新项目只有前camera,而hal层默认项目是有两个camera的,没有关于单camera的配置文件。基本上约定俗成的,0表示back camera,1表示front camera,这就导致原来的camera应用与cts无法pass。
解决方案:在hal层只加载front camera的配置信息,使0直接表示成front camera;当然只是这样更改cts camera项也不是全都能pass,还需要改一下system feature,去掉对back camera的支持;相关代码路径为:frameworks ativedataetc。再一个需要更改的就是media_profile.xml,需要将前后camera换一下。
在做过上述更改之后,cts所有camera fail项基本上都可以pass了!终于搞定了,但是,别着急,你会发现camera图标在应用列表中找不到了!
这是什么情况?更改hal层和fromework层怎么会影响到应用了啊?!经过千辛万苦,众里寻她千百度,终于发现了这个文件:
packagesappsCamerasrccomandroidcameraDisableCameraReceiver.java
下面我们来看一下这个文件的代码:
packagecom.android.camera;
importandroid.content.BroadcastReceiver;
importandroid.content.ComponentName;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.content.pm.PackageManager;
importandroid.hardware.Camera.CameraInfo;
importandroid.util.Log;
// We want todisable camera-related activities if there is no camera. This
// receiver runswhen BOOT_COMPLETED intent is received. After running once
// this receiverwill be disabled, so it will not run again.
public classDisableCameraReceiver extends BroadcastReceiver {
private static final String TAG ="DisableCameraReceiver";
private static final boolean CHECK_BACK_CAMERA_ONLY= true;
private static final String ACTIVITIES[] ={
"com.android.camera.CameraLauncher",
};
@Override
public void onReceive(Context context,Intent intent) {
// Disable camera-related activities ifthere is no camera.
boolean needCameraActivity = CHECK_BACK_CAMERA_ONLY
? hasBackCamera()
: hasCamera();
if (!needCameraActivity) {
Log.i(TAG, "disable all cameraactivities");
for (int i = 0; i <ACTIVITIES.length; i++) {
disableComponent(context,ACTIVITIES[i]);
}
}
// Disable this receiver so it wontrun again.
disableComponent(context,"com.android.camera.DisableCameraReceiver");
}
private boolean hasCamera() {
int n =android.hardware.Camera.getNumberOfCameras();
Log.i(TAG, "number of camera:" + n);
return (n > 0);
}
private boolean hasBackCamera() {
int n =android.hardware.Camera.getNumberOfCameras();
CameraInfo info = new CameraInfo();
for (int i = 0; i < n; i++) {
android.hardware.Camera.getCameraInfo(i, info);
if (info.facing ==CameraInfo.CAMERA_FACING_BACK) {
Log.i(TAG, "back camerafound: " + i);
return true;
}
}
Log.i(TAG, "no back camera");
return false;
}
private void disableComponent(Contextcontext, String klass) {
ComponentName name = newComponentName(context, klass);
PackageManager pm =context.getPackageManager();
// We need the DONT_KILL_APP flag,otherwise we will be killed
// immediately because we are in thesame app.
pm.setComponentEnabledSetting(name,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
}
}
当系统启动完毕后,会发送BOOT_COMPLETED 的intent,这个receiver收到这个intent,会check系统是否有back camera(hasBackCamera),结果肯定是没有的啊,这时就会调用disableComponent将此组件disable了,所以camera图标就不见了。
我们的解决方法就是,收到系统启动完毕的intent后,不是check系统是否有back camera,而是check系统是否有camera(hasCamera),这样也应该是更合理的。
private static final boolean CHECK_BACK_CAMERA_ONLY= false;
完美解决!