Android autofocus The geomagnetic sensor and acceleration

After the camera preview can start a new AutoFocusManage objects, passing in context and camera.

Note that when you turn the camera off or stop the preview method unregisterListener method to be called.

AF is currently achieved after the current direction deviation original direction 8 ° (unfounded, can be adjusted).

AutoFocusManage.class

package com.skytech.demo.camera;

import android.content.Context;
import android.hardware.Camera;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;

public class AutoFocusManage {

    private SensorManager sensorManager;
    private Camera camera;
    private float[] accelerometerValues;
    private float[] magneticFieldValues;
    private float[] orientationValues = new float[3];
    private SensorEventListener accelerometerSensorEventListener = new SensorEventListener() {
        @Override
        public void onSensorChanged(SensorEvent event) {
            accelerometerValues = event.values;
            if (magneticFieldValues != null) {
                calculateOrientation();
            }
        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
        }
    };
    private SensorEventListener magneticFieldSensorEventListener = new SensorEventListener() {
        @Override
        public void onSensorChanged(SensorEvent event) {
            magneticFieldValues = event.values;
            if (accelerometerValues != null) {
                calculateOrientation();
            }
        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
        }
    };

    public AutoFocusManage(Context context, Camera camera) {
        this.camera = camera;
        sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
        // 初始化加速度传感器
        Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        // 初始化地磁场传感器
        Sensor magneticField = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
        sensorManager.registerListener(accelerometerSensorEventListener, accelerometer, SensorManager.SENSOR_DELAY_UI);
        sensorManager.registerListener(magneticFieldSensorEventListener, magneticField, SensorManager.SENSOR_DELAY_UI);
    }

    public void unregisterListener() {
        sensorManager.unregisterListener (accelerometerSensorEventListener); 
        sensorManager.unregisterListener (magneticFieldSensorEventListener); 
    } 

    / ** 
     * calculated acceleration and the direction of the geomagnetic field 
     * / 
    Private  the synchronized  void calculateOrientation () {
         a float [] values = new new  a float [. 3 ];
         a float [] R & lt = new new  a float [. 9 ]; 
        SensorManager.getRotationMatrix (R & lt, null , accelerometerValues, magneticFieldValues); 
        SensorManager.getOrientation (R & lt, values); 
        a float [] Orientation = new new float[3];
        orientation[0] = (float) Math.toDegrees(values[0]);
        orientation[1] = (float) Math.toDegrees(values[1]);
        orientation[2] = (float) Math.toDegrees(values[2]);
        if (Math.abs(orientation[0] - orientationValues[0]) >= 8 || Math.abs(orientation[1] - orientationValues[1]) >= 8 || Math.abs(orientation[2] - orientationValues[2]) >= 8) {
            orientationValues = orientation;
            camera.autoFocus(new Camera.AutoFocusCallback() {
                @Override
                public void onAutoFocus(boolean success, Camera camera) {
                }
            });
        }
    }

}

 

Guess you like

Origin www.cnblogs.com/hackyo/p/11773042.html