关于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;

完美解决!

经验分享 程序员 微信小程序 职场和发展