android source

Direction Sensor

리오파파 2022. 5. 15. 14:41

 


import android.app.AlertDialog;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;

import static android.hardware.Sensor.TYPE_ACCELEROMETER;
import static com.urrecliner.blackbox.Vars.mContext;
import static com.urrecliner.blackbox.Vars.startStopExit;

public class DirectionSensor implements SensorEventListener{

    private SensorManager sensorManager;
    private Sensor rotationVector, accelerometer, magnetometer;
    private float[] rotationMatrix = new float[9];
    private float[] orientation = new float[9];
    private float[] lastAccelerometer = new float[3];
    private float[] lastMagnetometer = new float[3];
    private boolean haveSensor = false, haveSensor2 = false;
    private boolean lastAccelerometerSet = false;
    private boolean lastMagnetometerSet = false;

//    public void start(){
//        sensorManager = (SensorManager)mActivity.getSystemService(SENSOR_SERVICE);
//
//        if(sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR) == null) {
//            if(sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) == null || sensorManager.getDefaultSensor(TYPE_ACCELEROMETER) == null) {
//                noSensorAlert();
//            }
//            else {
//                accelerometer = sensorManager.getDefaultSensor(TYPE_ACCELEROMETER);
//                magnetometer = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
//
//                haveSensor = sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
//                haveSensor2 = sensorManager.registerListener(this, magnetometer, SensorManager.SENSOR_DELAY_NORMAL);
//            }
//        }
//        else {
//            rotationVector = sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
//            haveSensor = sensorManager.registerListener(this, rotationVector, SensorManager.SENSOR_DELAY_NORMAL);
//        }
//    }

    float azimuth = 0;
    @Override
    public void onSensorChanged(SensorEvent event) {
        int type = event.sensor.getType();
        if( type == Sensor.TYPE_ROTATION_VECTOR) {
            SensorManager.getRotationMatrixFromVector(rotationMatrix, event.values);
            azimuth = (float)(Math.toDegrees(SensorManager.getOrientation(rotationMatrix, orientation)[0]) + 360 + 90);
        }
        else if(event.sensor.getType() == TYPE_ACCELEROMETER) {
            System.arraycopy(event.values, 0, lastAccelerometer, 0, event.values.length);
            lastAccelerometerSet = true;
        }
        else if(event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
            System.arraycopy(event.values, 0, lastMagnetometer, 0, event.values.length);
            lastMagnetometerSet = true;
        }
        if(lastAccelerometerSet && lastMagnetometerSet) {
            SensorManager.getRotationMatrix(rotationMatrix, null, lastAccelerometer, lastMagnetometer);
            SensorManager.getOrientation(rotationMatrix, orientation);
            azimuth = (float)(Math.toDegrees(SensorManager.getOrientation(rotationMatrix, orientation)[0]) + 360 + 90);
        }

        azimuth = Math.round(azimuth);

//        utils.log(logID, String.format(Locale.getDefault(),"%d° %s", azimuth, where));
    }

    void stop(){
        if(haveSensor && haveSensor2){
            sensorManager.unregisterListener(this, accelerometer);
            sensorManager.unregisterListener(this, magnetometer);
        }
        else if(haveSensor) {
            sensorManager.unregisterListener(this, rotationVector);
        }
    }

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

    private void noSensorAlert(){
        AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);
        alertDialog.setMessage("Your device does not support the simply_compass.")
                .setCancelable(false)
                .setNegativeButton("Close", (dialog, i) -> startStopExit.exitBlackBoxApp());
    }
}

'android source ' 카테고리의 다른 글

layer xml로 버튼모양 만들기  (0) 2023.12.17
Background Handler 준비해 두기  (0) 2022.05.15
OBDII 연결 방법  (0) 2022.05.13
Media data Retrieve  (0) 2020.12.23
media update after write file  (0) 2020.02.02