关于camera CTS调试中遇到的问题

       最近在调试新项目camera cts,在调试过程中遇到了一些问题,写下来总结一下。

       问题引子:新项目只有前camera,而hal层默认项目是有两个camera的,没有关于单camera的配置文件。基本上约定俗成的,0表示back camera1表示front camera,这就导致原来的camera应用与cts无法pass

       解决方案:在hal层只加载front camera的配置信息,使0直接表示成front camera;当然只是这样更改cts camera项也不是全都能pass,还需要改一下system feature,去掉对back camera的支持;相关代码路径为:frameworks\native\data\etc再一个需要更改的就是media_profile.xml,需要将前后camera换一下。

       在做过上述更改之后,cts所有camera fail项基本上都可以pass了!终于搞定了,但是,别着急,你会发现camera图标在应用列表中找不到了!

       这是什么情况?更改hal层和fromework层怎么会影响到应用了啊?!经过千辛万苦,众里寻她千百度,终于发现了这个文件:

packages\apps\Camera\src\com\android\camera\DisableCameraReceiver.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 won'trun 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 camerahasBackCamera),结果肯定是没有的啊,这时就会调用disableComponent将此组件disable了,所以camera图标就不见了。

       我们的解决方法就是,收到系统启动完毕的intent后,不是check系统是否有back camera,而是check系统是否有camerahasCamera),这样也应该是更合理的。

       private static final boolean CHECK_BACK_CAMERA_ONLY= false;

       完美解决!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值