相机假自动对焦添加

packages/apps/Camera/src/com/android/camera/CameraActivity.java类中:

1,声明变量

private static final String FAKE_FOCUS = android.os.SystemProperties.get("ro.proj_w80_fake_focus");//添加配置

private static final int RESET_TOUCH_FOCUS = 18;

private static final int SHOW_FOCUS_START_UI = 19;

    private static final int SHOW_FOCUS_SUCCESS_UI = 20;

    private final int FOCUS_START_ANIMATION_TIME = 500;

    private final int FOCUS_SUCCESS_ANIMATION_TIME = 100;

    private PositionListener mPositionListener = new PositionListener();

    private float mGsensorValue[] = new float[3];

    private int mGsensorValueGetCounter = 0;

    private int mGsensorValueMotionCounter = 0;

    private int mGsensorValueStabCounter = 0;

    private boolean mGsensorMotionDetect = false;

    private MediaActionSound mCameraSound;

private SensorManager mSensorManager; //传感器

2,onCreate()函数中初始化传感器,并注册

mSensorManager = (SensorManager)(getSystemService(Context.SENSOR_SERVICE));      

registerSensorListener();

3,onDestroy()注销传感器

unRegisterSensorListener();

4,构造registerSensorListener()unRegisterSensorListener()方法

public void registerSensorListener() {  

Sensor gsensor = null;        

if (FAKE_FOCUS.equals("1")) {       

            gsensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);            

            if (gsensor != null) {                

                mSensorManager.registerListener(mPositionListener, gsensor, SensorManager.SENSOR_DELAY_NORMAL);            

            }        

        }    

    }

    public void unRegisterSensorListener() {    

        Sensor gsensor = null;        

        if (FAKE_FOCUS.equals("1")) {       

            gsensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);            

            if (gsensor != null) {                

                mSensorManager.unregisterListener(mPositionListener, gsensor);            

            }        

        }    

    }

private class PositionListener implements SensorEventListener {        

      public void onAccuracyChanged(Sensor sensor, int accuracy) {        

        }        

        public void onSensorChanged(SensorEvent event) {            

            switch (event.sensor.getType()) {                

                case Sensor.TYPE_GYROSCOPE : {                    

                    break;                

                }

                case Sensor.TYPE_ACCELEROMETER : {                    

                    //if(mCAFNeedGsensorCal){                   

                    if(0 == mGsensorValueGetCounter){                        

                        mGsensorValue[0]= event.values[0];                        

                        mGsensorValue[1]= event.values[1];                        

                        mGsensorValue[2]= event.values[2];

                        mGsensorValueStabCounter = 0;

                        mGsensorMotionDetect = false;                   

                    }else if(!mGsensorMotionDetect){                        

                        if(((mGsensorValue[0]- event.values[0])>1 || (mGsensorValue[0]- event.values[0])< -1) 

                                || ((mGsensorValue[1]- event.values[1])>1 || (mGsensorValue[1]- event.values[1])< -1) 

                                || ((mGsensorValue[2]- event.values[2])>1 || (mGsensorValue[2]- event.values[2])< -1)){                            

                            Log.v("CAF", "gsensor motion detect cnt = "+mGsensorValueMotionCounter);                            

                            if(mGsensorValueMotionCounter++ > 0){                                

                                mGsensorMotionDetect = true;                                

                                mGsensorValue[0]= event.values[0];                                

                                mGsensorValue[1]= event.values[1];                                

                                mGsensorValue[2]= event.values[2];                            

                            }

                        }else{                            

                            mGsensorValueMotionCounter = 0;                        

                        }                    

                           }else{                        

                        if(((mGsensorValue[0]- event.values[0])<2 && (mGsensorValue[0]- event.values[0])> -2) 

                                && ((mGsensorValue[1]- event.values[1])<2 && (mGsensorValue[1]- event.values[1])> -2) &&                            

                                ((mGsensorValue[2]- event.values[2])<2 && (mGsensorValue[2]- event.values[2])> -2)){                            

                            Log.v("zjx", "gsensor stab cnt = " + mGsensorValueStabCounter + ",getCameraId() == " + getCameraId() + 

                                    ",CameraHolder.instance().getFrontCameraId() == " + CameraHolder.instance().getFrontCameraId());                            

                            if(mGsensorValueStabCounter++ > 1){                                

                                //mCAFNeedGsensorCal = false;                                 

                                mGsensorMotionDetect = false;                                

                                if(getCameraId() == CameraHolder.instance().getFrontCameraId()){

                                    if (getCameraState() == STATE_IDLE || getCameraState() == MSG_CAMERA_PARAMETERS_READY) {

                                        mMainHandler.removeMessages(SHOW_FOCUS_START_UI);

                                        mMainHandler.sendEmptyMessage(SHOW_FOCUS_START_UI);

                                        

                                }

                            }                        

                        }else{                            

                            mGsensorValueStabCounter = 0;                        

                        }                        

                        mGsensorValue[0]= event.values[0];                        

                        mGsensorValue[1]= event.values[1];                        

                        mGsensorValue[2]= event.values[2];                    

                    }                    

                    mGsensorValueGetCounter++;

}            

            }

        }

    }

5,handler函数中处理消息

case SHOW_FOCUS_START_UI: {                 

                mGsensorValueGetCounter = 0;                

                if (getFocusManager() != null && getCameraDevice() != null){             

                    getFocusManager().getFocusLayout().showStart();          

                    getCameraDevice().setParametersAsync(getParameters(),1); //调整焦距,使其有放大缩小的效果            

                }            

                mMainHandler.removeMessages(SHOW_FOCUS_SUCCESS_UI);                     

                mMainHandler.sendEmptyMessageDelayed(SHOW_FOCUS_SUCCESS_UI, FOCUS_START_ANIMATION_TIME);               

                break;                

            }

            case SHOW_FOCUS_SUCCESS_UI: {

                mGsensorValueGetCounter = 0; 

                if (getFocusManager() != null && getCameraDevice() != null){                     

                    getFocusManager().getFocusLayout().showSuccess(true);            

                    getCameraDevice().setParametersAsync(getParameters(),0);//对焦成功后,恢复对焦             

                    //if(mFocusManager.mListener != null){

                    //mFocusManager.mListener.playSound(MediaActionSound.FOCUS_COMPLETE);

                    //}

                }

                mMainHandler.removeMessages(RESET_TOUCH_FOCUS);                   

                mMainHandler.sendEmptyMessageDelayed(RESET_TOUCH_FOCUS, FOCUS_START_ANIMATION_TIME);

                break;

            }

            case RESET_TOUCH_FOCUS: {                 

                    if(getFocusManager() != null) getFocusManager().getFocusLayout().clear();                

                break;               

                 }

            

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值