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


