Simulace senzorů v Android emulátoru

No Image-02

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

  1. stáhněte SensorSimulator zde
  2. archiv rozbalte a příkazem java -jar tools/sensorsimulator.jar spusťte desktopový server
  3. nainstalujte OpenIntents.apk do emulátoru příkazem adb -e install OpenIntents.apk
  4. mezi aplikacemi v telefonu se vám objeví aplikace Open Intents, spusťte ji
  5. přeskočte úvodní obrazovku klávesou zpět a na záložce Settings vyberte Sensor Simulator
  6. 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ží
  7. nastavte stejný socket, jako je nastavený v desktopové aplikaci, standardně 8010
  8. přepněte se na záložku Testing a klikněte na tlačítko Connect
  9. měl by se ukázat seznam dostupných senzorů
  10. 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
    //...
}
  1. mezi použité knihovny zařaďte lib/openintents-lib.jar
  2. před samotným získáním sensor manageru je potřeba ještě nastavit content resolver, který SensorSimulator interně používá
  3. 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
  4. 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>
  5. 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();
}
  1. typicky budete chtít na volání metody onResume() registrovat SensorListener pro aktualizace sledovaných senzorů
  2. 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]));
    }
}
  1. SensorListener má dvě metody, které musíte implementovat
  2. onAccuracyChanged() je volána při změně přesnosti
  3. 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

Mohlo by vás zajímat

Komentáře (0)