Google Glass

  w praktyce

Michał Staruch

Cinkciarz.pl

JUG Zielona Góra

listopad 2014

Opis platformy

  • Android 4.4.4 (XE22)
  • wyświetlacz pryzmatyczny 640x360 px
  • TI OMAP 4430 (2 x ARMv7 1.2 GHz)
  • 1 lub 2 GB RAM, 16 GB FLASH
  • Wi-Fi, Bluetooth
  • akcelerometr, magnetometr, żyroskop
  • cena $1500 (Explorer Edition)

Glass vs Android

  • inne wzorce UX
  • inny styl UI
  • jeden rozmiar ekranu i rozdzielczość
  • niektóre API nie są wspierane,
    np. ListView.setSelection()
  • niektóre API w starszej wersji (Sensor -> 4.2)
  • brak Google Play Store
  • publikacja dopiero po przejściu review

GDK, Mirror API

  • sterowanie głosowe
  • obsługa touchpada
  • dedykowane widgety

GDK - Android SDK z dodatkami dla Glass:

Mirror API - REST w chmurze Google:

  • autoryzacja przez OAuth 2.0
  • wysyłanie notyfikacji
  • dostęp do kontaktów
  • dostęp do lokalizacji
  • ustawienia

Cinkciarz.pl for Glass™

  • aplikacja oparta na GDK
  • nie wymaga żadnych uprawnień
  • wyświetla aktualne kursy walut
  • do wyboru 4 z 34 par walutowych
  • aktywacja komendą głosową
  • w opcjach sterowanie ruchem głowy
  • publikacja pierwszej wersji 27 X 2014
  • w pierwszej 100 aplikacji na Glass

Uruchamianie

<intent-filter>
    <action android:name="com.google.android.glass.action.VOICE_TRIGGER" />
</intent-filter>

<meta-data
    android:name="com.google.android.glass.VoiceTrigger"
    android:resource="@xml/find_the_exchange_rate" />
<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

na Glass nie ma launchera

intent-filter z manifestu dla Androida
intent-filter i meta-data z manifestu dla Glass

Uruchamianie c.d.

  • komendy głosowe do uruchamiania są częścią API
  • na liście VoiceTriggers.Command nie było nic pasującego do wymiany walut
  • wysłanie zgłoszenia przez Voice Command Form - początek lipca
  • pozytywne rozpatrzenie zgłoszenia - 29 lipca
  • release XE21 z dodaną nową komendą - 8 września

Pierwsze podejście

  • aplikacja jako Activity
  • prosty layout
  • żadnych bajerów
  • przetestowana
  • "na pewno przejdzie"

Wyniki review

  • aplikacje typu ciągła aktywność
    muszą być zrealizowane jako Live Card
  • padding niezgodny z zaleceniami
  • czcionki niezgodne z zaleceniami
  • kolory niezgodne z zaleceniami
  • niewłaściwe pozycjonowanie i rozmiary logo
  • nadmiarowy branding w logo
  • brak dźwięku po tapnięciu
  • blokowanie wygaszania ekranu
  • za mało widoczna informacja o łączeniu
  • brak przekierowania do ustawień sieci
    przy braku połączenia

Live Card

  • Live Card - ekran na timeline z różnymi API do renderingu
  • sporadyczne odświeżanie - RemoteViews
  • częste odświeżanie - DirectRenderingCallback / GlRenderer

Porównanie v1.0 z v1.2

niewielkie zmiany w stylach...

... i przepisanie aplikacji

Publikacja

  • "final approval" - około tygodnia
  • planowane materiały PR do weryfikacji przez Google
  • "Glassware" zamiast "application for Glass"
  • w nagłówkach materiałów "Glass™", a nie "Glass"
  • po uzyskaniu pełnej akceptacji - prośba o podanie
    daty publikacji z 48-godzinnym wyprzedzeniem

Kolejny etap - dodajemy opcje

Opcje

  • więcej par walutowych
  • wybór ilości jednostek
  • sterowanie ruchem głowy

Sterowanie ruchem głowy

SensorManager.getRotationMatrixFromVector(mRotationMatrix, mSensorValues);
SensorManager.remapCoordinateSystem(mRotationMatrix,
    SensorManager.AXIS_X, SensorManager.AXIS_Z, mRotationMatrix);
SensorManager.getOrientation(mRotationMatrix, mOrientation);

final float yaw = mOrientation[0];
final float pitch = mOrientation[1];
  • Sensor.TYPE_ROTATION_VECTOR -> yaw, pitch
  • ruchome okno dla wartości yaw, pitch
  • przemapowanie na współrzędne ekranu

Stabilizujemy kursor - histereza

public int getValue(final float in, final int currentOut) {
    final float lowLimit = currentOut * mStepSize - mInputMargin;
    final float highLimit = (currentOut + 1) * mStepSize + mInputMargin;
    if (in <= lowLimit) {
        return getValue(in, currentOut - 1);
    } else if (in >= highLimit) {
        return getValue(in, currentOut + 1);
    } else {
        return currentOut;
    }
}

Review wersji 1.4.x

  • zamienić tapnięcia na autoselekcję po timeoucie
  • ustawić pół-przezroczysty styl w ekranie z opcjami (...)
  • dodać wskaźnik postępu auto-selekcji (Drawable.setLevel() + <clip>))
  • dodać obszar spoczynkowy
  • obsłużyć tapnięcia
  • opcje w menu muszą być akcjami (Options -> Show Options)

Work in progress - wykresy

  • swipe'owalne karty - CardScrollView, CardScrollAdapter
  • rysowanie - Canvas.drawLines(float[] pts, Paint paint)

Źródła

/thanks

Google Glass w praktyce

By Michał Staruch

Google Glass w praktyce

JUG Zielona Góra, 2014

  • 1,491