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;
}