Come convertire un programma che utilizza SensorListener a SensorEventListener
Domanda
Sto creando un'applicazione denominata Compassapp.Ho creato due lezioni di nome Compass.java e Rose.java.Questa applicazione è stata creata da un tutorial descritto in un sito Web e questo utilizza la versione deprecata di SensorListener.La classe Compass.java utilizza questa versione deprecata.L'app ha funzionato bene quando ho usato la versione deprecata.Poi ho pensato di convertire la mia app nella versione corrente che è SensireventListener.Ma la rotazione della bussola si è fermata!Sono bloccato e non so cosa fare.Per favore aiutami.
bussola.java con interfaccia sensorlistente deprecata
public class Compass extends Activity implements SensorListener {
SensorManager sensorManager;
static final int sensor = SensorManager.SENSOR_ORIENTATION;
MyRose rose;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Set full screen view
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
requestWindowFeature(Window.FEATURE_NO_TITLE);
rose = new MyRose(this);
setContentView(rose);
// get sensor manager
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
}
// register to listen to sensors
@Override
public void onResume() {
super.onResume();
sensorManager.registerListener(this, sensor);
}
// unregister
@Override
public void onPause() {
super.onPause();
sensorManager.unregisterListener(this);
}
// Ignore for now
public void onAccuracyChanged(int sensor, int accuracy) {
}
// Listen to sensor and provide output
public void onSensorChanged(int sensor, float[] values) {
if (sensor != Compass.sensor)
return;
int orientation = (int) values[0];
rose.setDirection(orientation);
}
}
.
bussola.java con nuovo sensorreventListener
public class Compass extends Activity{
SensorManager sensorManager;
SensorEventListener listener ;
static final int sensor = SensorManager.SENSOR_ORIENTATION;
Rose rose;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Set full screen view
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
requestWindowFeature(Window.FEATURE_NO_TITLE);
listener = new SensorEventListener()
{
@Override
public void onSensorChanged(SensorEvent e)
{
int orientation = (int) e.values[0];
rose.setDirection(orientation);
}
@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {
// TODO Auto-generated method stub
}
};
setContentView(rose);
// get sensor manager
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
sensorManager.registerListener(listener, sensorManager.getDefaultSensor(sensor),SensorManager.SENSOR_MAGNETIC_FIELD);
}
// register to listen to sensors
@Override
public void onResume() {
super.onResume();
sensorManager.registerListener(listener, sensorManager.getDefaultSensor(sensor), SensorManager.SENSOR_MAGNETIC_FIELD);
}
// unregister
@Override
public void onPause() {
super.onPause();
sensorManager.unregisterListener(listener);
}
}
. Soluzione
Penso che questo sia ciò di cui hai bisogno.
public class Compass extends Activity implements SensorEventListener {
SensorManager sensorManager;
static final int sensor = SensorManager.SENSOR_ORIENTATION;
MyRose rose;
private Sensor myCompassSensor;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Set full screen view
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
requestWindowFeature(Window.FEATURE_NO_TITLE);
rose = new MyRose(this);
setContentView(rose);
// get sensor manager
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
// get compass sensor (ie magnetic field)
myCompassSensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
}
// register to listen to sensors
@Override
public void onResume() {
super.onResume();
sensorManager.registerListener(this, myCompassSensor, SensorManager.SENSOR_DELAY_NORMAL);
}
// unregister
@Override
public void onPause() {
super.onPause();
sensorManager.unregisterListener(this);
}
// Ignore for now
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
public void onSensorChanged(SensorEvent event) {
// this check is unnecessary with only one registered sensor
// but it's useful to know in case you need to add more sensors
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
int orientation = (int) event.values[0];
rose.setDirection(orientation);
}
}
}
.
Modifica: aggiunta Verifica per determinare il tipo di sensore