Simulace senzorů v Android emulátoru
Při vyhlášení dubnové online dílny GUG.CZ jsme slíbili, že na portálu Můj Android se budou postupně objevovat návody, které by vám s implementací Netýkavky alias AntiLapky mohly pomoct.
V prvním díle se podíváme na to, jak simulovat vstupy pro senzor polohy a zrychlení v emulátoru androidího telefonu.
Nejlepší je začít na stránkách Open Intents, kde můžete najít docela podrobný popis, jak pomocí simulátoru reagovat v emulátoru na změny polohy a zrychlení telefonu. SensorSimulator se skládá ze dvou částí. První část je jednoduchá desktopová aplikace s gui a serverem. Na tento server se připojí SensorManagerSimulator, který obaluje původní SensorManager, a naslouchá událostem, které generujete přes gui desktopové aplikace. Simulovat můžete zrychlení, polohu, kompas a teplotu. Kód Android aplikace zůstává kromě inicializační fáze stejný jako při použití reálného zařízení.
Instalace
- stáhněte SensorSimulator zde
- archiv rozbalte a příkazem
java -jar tools/sensorsimulator.jarspusťte desktopový server - nainstalujte OpenIntents.apk do emulátoru příkazem
adb -e install OpenIntents.apk - mezi aplikacemi v telefonu se vám objeví aplikace Open Intents, spusťte ji
- přeskočte úvodní obrazovku klávesou zpět a na záložce Settings vyberte Sensor Simulator
- pokud vám desktopová aplikace a emulátor beží na stejném počítači, tak do políčka IP address zadejte 10.0.2.2, což je standardní adresa používána emulátorem pro odkazování se na počítač, kde emulátor beží
- nastavte stejný socket, jako je nastavený v desktopové aplikaci, standardně 8010
- přepněte se na záložku Testing a klikněte na tlačítko Connect
- měl by se ukázat seznam dostupných senzorů
- pro aktivaci senzoru zaškrtněte příslušné zaškrtávátko a funkčnost můžete ověřit změnou v desktopové aplikaci
![]() |
![]() |
Vlastní aplikace
Inicializace
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//...
// odkomentováno z důvodu použití SensorSimulator
// použijte tento kód, pokud nasazujete na reálné zařízení
// mSensorManager =
// (SensorManager) getSystemService(SENSOR_SERVICE);
// začátek inicializačního kódu pro SensorSimulator
// před voláním simulátoru musí být nastaven content
// resolver, který používá sám simulátor
Hardware.mContentResolver = getContentResolver();
// nastav sensor manager, aby používal sensor simulátor
mSensorManager = (SensorManager) new SensorManagerSimulator(
(SensorManager) getSystemService(SENSOR_SERVICE));
// spusť aktivitu, kde se nastaví, které senzory budou aktivní
Intent intent = new Intent(
Intent.ACTION_VIEW,
Hardware.Preferences.CONTENT_URI);
startActivity(intent);
// konec inicializačního kódu pro SensorSimulator
//...
}
- mezi použité knihovny zařaďte
lib/openintents-lib.jar - před samotným získáním sensor manageru je potřeba ještě nastavit content resolver, který SensorSimulator interně používá
- místo klasického
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);pro získání sensor manageru musíte použít volání, které obaluje sensor manager komunikací s desktopovým serverem - nezapomeňte aplikaci dát právo pro přístup k internetu, jinak se emulátor nepřipojí k desktopovému serveru – do AndroidManifest.xml přidejte
<uses-permission android:name="android.permission.INTERNET"></uses-permission> - po vlastní registraci sensor manageru je třeba spustit aktivitu pro nastavení senzorů, které budou v aplikaci aktivní, do vaší aktivity se vrátíte po nastavení senzorů zmáčknutím tlačítka zpět
Životní cyklus
@Override
protected void onResume() {
super.onResume();
// volání SensorManagerSimulator.connectSimulator() není potřeba,
// pokud nasazujete na reálné zařízení
SensorManagerSimulator.connectSimulator();
// registruj listenery pro senzor akcelerace a orientace
mSensorManager.registerListener(
this,
SensorManager.SENSOR_ACCELEROMETER |
SensorManager.SENSOR_ORIENTATION,
SensorManager.SENSOR_DELAY_FASTEST);
}
@Override
protected void onStop() {
mSensorManager.unregisterListener(this);
super.onStop();
}
- typicky budete chtít na volání metody
onResume()registrovat SensorListener pro aktualizace sledovaných senzorů - a typicky budete chtít na volání metody
onStop()tuto registraci zrušit pro šetření systémovými zdroji
Aktualizace senzorů
@Override
public void onSensorChanged(int sensor, float[] values) {
if (sensor == SensorManager.SENSOR_ACCELEROMETER) {
tvAccelerometer.setText(
getString(
R.string.accelerometer,
values[0], values[1], values[2]));
}
if (sensor == SensorManager.SENSOR_ORIENTATION) {
tvOrientation.setText(
getString(
R.string.orientation,
values[0], values[1], values[2]));
}
}
- SensorListener má dvě metody, které musíte implementovat
- onAccuracyChanged() je volána při změně přesnosti
- nás zajímá především metoda onSensorChanged(int sensor, float[] values), která je volána pro každou změnu na jednotlivých sensorech. Senzor, u kterého došlo ke změně, je předán v parametru sensor. Pro porovnání můžete použít symbolické konstanty definované ve třídě SensorManager. Parametr values je pak pole nových hodnot. Význam jednotlivých položek je pro různé senzory různý a je popsaný u symbolické konstanty senzoru ve třídě SensorManager. Například pro senzor zrychlení je v položce s indexem 0 hodnota zrychlení ve směru x-ové souřadnice, v položce s indexem 1 hodnota zrychlení ve směru x-ové souřadnice a v položce s indexem 2 hodnota zrychlení ve směru z-ové souřadnice










