In questo tutorial vedremo come creare la nostra Bussola utilizzando l’ accelerometro e il sensore geomagnetico per determinare l’orientamento del dispositivo
All interno del metodo onCreate instanziamo il gestore dei sensori e TexView.
Il metodo onSensorChanged viene eseguito non appena un qualsiasi sensore del nostro dispositivo cambia di stato. onAccuracyChanged è il metodo che viene chiamato quando la precisione di un sensore cambia.
Ecco il codice:
<?xml version=”1.0″ encoding=”utf-8″?>
<LinearLayout
xmlns:android=”http://schemas.android.com/apk/res/android”
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:gravity=”center”
android:orientation=”vertical”>
<TextView
android:id=”@+id/text1″
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:layout_centerHorizontal=”true”
android:layout_marginBottom=”10dp”
android:layout_marginTop=”20dp”
android:background=”#78AA68″
android:textSize=”50sp”/>
</LinearLayout>
package com.exsample.appCompass.activities;
import android.app.Activity;
import android.os.Bundle;
import com.exsample.appCompass.R;
import android.hardware.*;
import android.widget.*;
import android.content.*;
public class MainActivity extends Activity {
Sensor accelerometerSensor,magneticSensor;
SensorManager sensorManager;
String orientation;
TextView txt_compass;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
magneticSensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
accelerometerSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sensorManager.registerListener(listener, magneticSensor, SensorManager.SENSOR_DELAY_NORMAL);
sensorManager.registerListener(listener, accelerometerSensor,SensorManager.SENSOR_DELAY_NORMAL);
txt_compass=findViewById(R.id.text1);
}
@Override
protected void onDestroy (){
super.onDestroy();
if (sensorManager != null) {
sensorManager.unregisterListener(listener);
}
}
private SensorEventListener listener = new SensorEventListener() {
float[] mAccelerometer= new float[3];
float[] mMagnetometer = new float[3];
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
mAccelerometer= event.values.clone();
} else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
mMagnetometer = event.values.clone();
}
float[] rMat= new float[9];
float[] values = new float[3];
SensorManager.getRotationMatrix(rMat, null,mAccelerometer,
mMagnetometer);
SensorManager.getOrientation(rMat, values);
int mAzimut= (int) Math.toDegrees(values[0] +360 )%360;
{
mAzimut= (int) Math.toDegrees(values[0]);
mAzimut= (mAzimut+360) % 360;
if (mAzimut>= 350 || mAzimut<= 10)
orientation= “N”;
if (mAzimut< 350 && mAzimut> 280)
orientation= “NW”;
if (mAzimut<= 280 && mAzimut> 260)
orientation= “W”;
if (mAzimut<= 260 && mAzimut> 190)
orientation= “SW”;
if (mAzimut<= 190 && mAzimut> 170)
orientation= “S”;
if (mAzimut<= 170 && mAzimut> 100)
orientation= “SE”;
if (mAzimut<= 100 && mAzimut> 80)
orientation= “E”;
if (mAzimut<= 80 && mAzimut> 10)
orientation= “NE”;
txt_compass.setText(mAzimut+ “° ” +orientation);
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
}
