The Android developers can use Sensor Simulator to test their applications, in particular when they use sensors such as accelerometer or compass.
In this post I explain the differences in the code for an activity that runs on the emulator or a real device, and I don’t discuss how to install or launch the emulator, for those topics you can refer to Sensor Simulator.
Switching from the emulator to the real device and vice versa you need to make some code changes and these changes can be divided into 4 points.
- different imports
- connection to the simulator in the onCreate method (this part is missing in the current code for the device)
- different listeners in the onResume method
- different ways to get the type of sensor in the onSensorChanged method
Here below I write the code with which you can connect to the emulator, to switch to the code for the real device comment the lines between
/ / SENSOR SIMULATOR
and
/ / **********
and uncomment the lines between
/ / REAL DEVICE
and
/ / **********.
package eu.lucazanini.sensorsimulator; // SENSOR SIMULATOR import org.openintents.sensorsimulator.hardware.Sensor; import org.openintents.sensorsimulator.hardware.SensorEvent; import org.openintents.sensorsimulator.hardware.SensorEventListener; import org.openintents.sensorsimulator.hardware.SensorManagerSimulator; // ********** // REAL DEVICE //import android.hardware.Sensor; //import android.hardware.SensorEvent; //import android.hardware.SensorEventListener; //import android.hardware.SensorManager; // required for getRotationMatrix and getOrientation //********** import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; public class SensorSimulatorActivity extends Activity implements SensorEventListener { // SENSOR SIMULATOR private SensorManagerSimulator mSensorManager; private ConnectionToSensorSimulator conn; // ********** // REAL DEVICE // private SensorManager mSensorManager; // ********** @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // SENSOR SIMULATOR mSensorManager = SensorManagerSimulator.getSystemService(this, SENSOR_SERVICE); conn = new ConnectionToSensorSimulator(); conn.execute(); // ********** // REAL DEVICE // mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); // ********** } @Override protected void onResume() { super.onResume(); // SENSOR SIMULATOR mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManagerSimulator.SENSOR_DELAY_NORMAL); mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManagerSimulator.SENSOR_DELAY_NORMAL); mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE), SensorManagerSimulator.SENSOR_DELAY_NORMAL); // ********** // REAL DEVICE // mSensorManager.registerListener(this, // mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), // SensorManager.SENSOR_DELAY_NORMAL); // // mSensorManager.registerListener(this, // mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), // SensorManager.SENSOR_DELAY_FASTEST); // // mSensorManager.registerListener(this, // mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE), // SensorManager.SENSOR_DELAY_FASTEST); // ********** } @Override protected void onPause() { super.onPause(); mSensorManager.unregisterListener(this); } public void onAccuracyChanged(Sensor sensor, int accuracy) { } public void onSensorChanged(SensorEvent event) { synchronized (this) { // SENSOR SIMULATOR int sensor = event.type; // ********** // REAL DEVICE // int sensor = event.sensor.getType(); // ********** float[] values = event.values; switch (sensor) { case Sensor.TYPE_ACCELEROMETER: break; case Sensor.TYPE_MAGNETIC_FIELD: break; case Sensor.TYPE_GYROSCOPE: break; default: break; } } } private class ConnectionToSensorSimulator extends AsyncTask<Void, Void, Boolean> { @Override protected Boolean doInBackground(Void... params) { Log.d("SENSOR", "CONNECTING TO SENSOR SIMULATOR"); mSensorManager.connectSimulator(); return true; } @Override protected void onPostExecute(Boolean result) { super.onPostExecute(result); if (result) { Log.d("SENSOR", "CONNECTED TO SENSOR SIMULATOR"); } else { Log.d("SENSOR", "NOT CONNECTED TO SENSOR SIMULATOR"); } } } }
If you don’t want to use AsyncTask to connect to emulator, you can replace
mSensorManager = SensorManagerSimulator.getSystemService(this, SENSOR_SERVICE); conn = new ConnectionToSensorSimulator(); conn.execute();
with
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder() .permitAll().build(); StrictMode.setThreadPolicy(policy); mSensorManager = SensorManagerSimulator.getSystemService(this, SENSOR_SERVICE); mSensorManager.connectSimulator();
To get other info you can see this post.
The line
import android.hardware.SensorManager
may also be necessary for the emulator, for example because you have to get the rotation matrix (getOrientationMatrix method) or spatial orientation (method getOrientation).
Leave a Reply