Wear OS での Maps API

ウェアラブル デバイスに表示されたマップ

Maps SDK for Android を使って、Wear OS by Google デバイスで直接実行されるマップベースのウェアラブル アプリを作成できます。アプリのユーザーは、自分の手首をちらりと見るだけで、マップ上で現在地を確認できます。たとえば、ルート上に現在地を表示し、ズームインして詳細を確認したり、マーカーをタップしてアプリから提供される情報ウィンドウを表示したりできます。

このページでは、Wear デバイスで使用可能な API 機能について説明し、アプリのビルドを開始できるよう支援します。

Wear OS のスタートガイド

Maps SDK for Android を使用したウェアラブル アプリのビルドは、その他の Android デバイス用の Google マップ アプリのビルドと基本的には同じです。違いは、アプリのユーザビリティとパフォーマンスを最適化するための、ウェアラブル デバイスのより小さいフォーム ファクタ用のデザインにあります。

Android Studio は、プロジェクトのセットアップ、ライブラリの登録、パッケージングが容易に行える Wear OS 開発の推奨ツールです。

ウェアラブル アプリのデザインに関する一般的なヘルプについては、Wear OS の設計ガイドラインをご覧ください。初めてウェアラブル アプリを作成する際のヘルプについては、ウェアラブル アプリの作成に関するガイドをご覧ください。

Wear OS で最初のマップアプリをビルドする

このクイックガイドでは、読者が Maps SDK for Android をよく理解していること、Wear OS のガイドに従ってアプリにウェアラブル モジュールを作成していること、そのウェアラブル モジュールにマップを追加する必要があることを前提としています。

Wear モジュールの依存関係を追加する

アプリの Wear OS モジュールの build.gradle ファイルに以下の依存関係が含まれていることを確認します。

dependencies {
  compile fileTree(dir: 'libs', include: ['*.jar'])
  compile 'com.google.android.support:wearable:1.2.0'
  provided 'com.google.android.wearable:wearable:1.0.0'
  compile 'com.google.android.gms:play-services-maps:17.0.0'
}

依存関係について詳しくは、Wear OS でのレイアウトの定義に関するガイドをご覧ください。

ユーザーがアプリを終了するためのダイアログを含める

ウェアラブル デバイスにマップを表示するには、DismissOverlayView を使用することをおすすめします。DismissOverlayView クラスを使うと、長押しして消す UI パターンを実装して、ユーザーが画面を長押しクリック(長押し)することでアプリを終了できるようにすることができます。このパターンが推奨されるのは、Maps SDK for Android が、ウェアラブル アプリを終了するために一般的に使用される、標準の左から右へのスワイプを上書きするためです。Google マップアプリでは、スワイプ操作はマップをパンするために使用されます。

DismissOverlayView 要素をレイアウト定義に追加します。

<FrameLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_height="match_parent"
   android:layout_width="match_parent">

  ...

  <android.support.wearable.view.DismissOverlayView
     android:id="@+id/dismiss_overlay"
     android:layout_height="match_parent"
     android:layout_width="match_parent"/>

</FrameLayout>

アクティビティに DismissOverlayView オブジェクトを取得したら、以下に示すような、長押しクリック操作によりアプリを終了できることをユーザーに伝える紹介テキストを設定します。

public class MainActivity extends WearableActivity
        implements OnMapReadyCallback, GoogleMap.OnMapLongClickListener {

    private MapFragment mMapFragment;
    private DismissOverlayView mDismissOverlay;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.basic_wear_demo);

        mDismissOverlay =
            (DismissOverlayView) findViewById(R.id.dismiss_overlay);
        mDismissOverlay.setIntroText(R.string.basic_wear_long_press_intro);
        mDismissOverlay.showIntroIfNecessary();

        mMapFragment = (MapFragment) getFragmentManager()
                .findFragmentById(R.id.map);
        mMapFragment.getMapAsync(this);
    }
    ...
}

長押しクリック操作をリッスンして、DismissOverlayView.show() を呼び出して終了ボタンを表示します。このボタンをユーザーがクリックすると、アクティビティが終了します。

public void onMapLongClick(LatLng point) {
    mDismissOverlay.show();
}

マップを追加する

通常どおり onMapReady(GoogleMap) コールバック メソッドを使って、GoogleMap オブジェクトに対するハンドルを取得します。マップを使用できるようになると、コールバックがトリガーされます。コールバック メソッドでは、マップにマーカーやポリラインを追加したり、リスナーを追加したり、カメラを移動したりできます。以下の例では、シドニーのオペラハウスの近くにマーカーを追加しています。

public class MainActivity extends WearableActivity
        implements OnMapReadyCallback, GoogleMap.OnMapLongClickListener {

    private static final LatLng SYDNEY = new LatLng(-33.85704, 151.21522);
    private GoogleMap mMap;

    ...

    @Override
    public void onMapReady(GoogleMap map) {
        mMap = map;
        mMap.addMarker(new MarkerOptions().position(SYDNEY)
            .title("Sydney Opera House"));
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(SYDNEY, 10));
        mMap.setOnMapLongClickListener(this);
    }
}

アンビエント モードを有効化する

Maps SDK for Android は、ウェアラブル アプリのアンビエント モードをサポートしています。アンビエント モードをサポートするアプリは、常時オンアプリと呼ばれることもあります。アンビエント モードは、ユーザーが実際にアプリを使用しなくなったときにアクティブ化され、アプリをウェアラブル デバイスに表示し続けることができるようにします。

Maps SDK for Android では、アンビエント モードで使用する簡略化された、色数の少ないマップのレンダリングが提供されており、デバイスがインタラクティブ モードからアンビエント モードに切り替わると、マップのスタイルが自動的に調整されますアンビエント モードでは、すべてのマーカー、オブジェクト、UI コントロールが非表示になります。これにより、アプリの電力消費が削減され、他のアンビエント アプリと外観(ウォッチ フェイスなど)の一貫性が保持されます。

次のステップを実行して、アプリがマップのアンビエント モードを使用するようにします。

  1. Android 5.1(API 22)以降のプラットフォームを含むように Android SDK をアップデートします。これにより、アクティビティをアンビエント モードに切り替えることができる API が提供されます。SDK を更新する方法については、Android のドキュメントで SDK パッケージの追加をご覧ください。
  2. アプリ マニフェストtargetSdkVersion を 22 以上に設定して、プロジェクトの対象が Android 5.1 以降になるようにします。
  3. アプリの build.gradle ファイルにウェアラブル依存関係を追加します。こちらのページのサンプルをご覧ください。
  4. アプリを表示したままにするための Android トレーニング クラスの説明に従って、ウェアラブル共有ライブラリ エントリをウェアラブル アプリのマニフェストに追加します。
  5. アプリを表示したままにするための Android トレーニング クラスの説明に従って、WAKE_LOCK の権限をハンドヘルド アプリとウェアラブル アプリのマニフェストに追加します。
  6. WearableActivity を拡張するアクティビティを作成します。
  7. アクティビティの onCreate() メソッド内で、setAmbientEnabled() メソッドを呼び出します。これにより、アプリケーションは常時オンであるため、デバイスの電力が低下した場合はウォッチ フェイスに戻るのではなく、アンビエント モードに切り替える必要があることがオペレーティング システムに通知されます。
  8. アンビエント モードをサポートするようにマップを設定します。これには、アクティビティの XML レイアウト ファイルで属性の map:ambientEnabled="true" を設定するか、GoogleMapOptions.ambientEnabled(true) を設定してプログラムにより設定します。この設定により、アンビエント モードで使用するために必要なマップタイルを事前に読み込む必要があることが API に通知されます。
  9. アクティビティが常にアンビエント モードに切り替わると、システムによって onEnterAmbient() メソッドがウェアラブル アクティビティ内で呼び出されます。onEnterAmbient() をオーバーライドして、MapFragment.onEnterAmbient(ambientDetails) または MapView.onEnterAmbient(ambientDetails) を呼び出します。API により、非インタラクティブで色数の少ないマップのレンダリングに切り替えられます。
  10. 同様に、onExitAmbient()MapFragment.onExitAmbient() または MapView.onExitAmbient() を呼び出します。API により、マップの標準のレンダリングに切り替えられます。

次のコードサンプルでは、アプリとマップでアンビエント モードを有効にしています。

public class MainActivity extends WearableActivity
        implements OnMapReadyCallback, GoogleMap.OnMapLongClickListener {

    private MapFragment mMapFragment;

    public void onCreate(Bundle savedState) {
        super.onCreate(savedState);

        // Enable ambient support, so the map remains visible in a simplified,
        // low-color display when the user is no longer actively using the app
        // and the app is still visible on the watch face.
        setAmbientEnabled();

        // ... Perform other activity setup processes here too ...
    }

    /**
     * Starts ambient mode on the map.
     * The API swaps to a non-interactive and low-color rendering of the map
     * when the user is no longer actively using the app.
     */
    @Override
    public void onEnterAmbient(Bundle ambientDetails) {
        super.onEnterAmbient(ambientDetails);
        mMapFragment.onEnterAmbient(ambientDetails);
    }

    /**
     * Exits ambient mode on the map.
     * The API swaps to the normal rendering of the map when the user starts
     * actively using the app.
     */
    @Override
    public void onExitAmbient() {
        super.onExitAmbient();
        mMapFragment.onExitAmbient();
    }
}

アプリがアンビエント モードになっている間に、画面をアップデートできます。コンテンツのアップデートに関する詳細とアンビエント モードの一般的な詳細については、アプリを表示したままにするための Android トレーニング クラスをご覧ください。

Wear OS でストリートビューを使用する

ストリートビューは、ウェアラブル デバイスで完全にサポートされています。

ストリートビュー パノラマの表示中にユーザーがアプリを終了できるようにするには、StreetViewPanorama.OnStreetViewPanoramaLongClickListener インターフェースを使って、長押しクリック操作をリッスンします。ストリートビュー画像の任意の場所がユーザーにより長押しクリックされると、onStreetViewPanoramaLongClick(StreetViewPanoramaOrientation) イベントを受け取ります。DismissOverlayView.show() を呼び出して終了ボタンを表示します。

サンプルコード

GitHub にはサンプルアプリが用意されており、アプリのたたき台として使用できるようになっています。サンプルでは、Wear OS で基本的な Google マップを設定する方法を確認できます。

Wear OS の Maps API でサポートされている機能

このセクションでは、ウェアラブル デバイスとハンドヘルド デバイス(モバイル デバイスとタブレット)のマップでサポートされている機能を比較し、その違いについて概説します。以下に示されていない API 機能はすべて、完全な API のドキュメントに記されているとおりに動作します。

機能
完全なインタラクティブ モードとライトモード

Maps SDK for Android は、完全なインタラクティブ モードまたはライトモードで使用できます。ウェアラブル デバイスでパフォーマンスを最適化する必要があり、アプリで操作やマップのパンとズームといったインタラクションをサポートする必要がない場合は、ライトモードの使用を検討してください。

ライトモードでは、ユーザーがマップをタップしたときに Google マップ モバイルアプリを起動するインテントが無効になっており、ウェアラブル デバイスでは有効にできません。

ライトモードと完全なインタラクティブ モードの違いをすべて記したリストについては、ライトモードに関するドキュメントをご覧ください。

マップ ツールバー マップ ツールバー無効になっており、ウェアラブル デバイスでは有効にできません。
ユーザー インターフェース コントロール UI コントロールは、ウェアラブル デバイスではデフォルトで無効になっています。これには、ズーム、コンパス、現在地コントロールが含まれます。これらは、通常どおり、UiSettings クラスを使用して有効にできます。
操作 シングルタッチ操作は、正しく機能します。たとえば、タップとドラッグによるマップのパン、ダブルタップによるズームイン、2 本指タップによるズームアウトなどがあります。 マルチタッチ操作のサポートは、ユーザーのデバイスによって異なります。マルチタッチ操作の例には、2 本指プッシュによるマップのチルト、ピンチによるズーム、2 本指の回転などがあります。
インドアマップと建物 インドアマップは、ウェアラブル デバイスではデフォルトで無効になっています。これを有効にするには、GoogleMap.setIndoorEnabled(true) を呼び出します。インドアマップが有効になっている場合は、マップにデフォルトの階数レベルが表示されます。 レベルピッカー UI 要素は、ウェアラブル デバイスではサポートされていません。
タイル オーバーレイ タイル オーバーレイは、ウェアラブル デバイスではサポートされていません

Wear OS での Maps API を使用した開発のベスト プラクティス

アプリで優れたユーザー エクスペリエンスを提供する方法を次に示します。

  • マップは画面の大部分を占めるように表示される必要があります。これは、ウェアラブル デバイスの小さいフォーム ファクタでマップのユーザビリティを最適化するために必要です。
  • アプリのユーザー エクスペリエンスをデザインするときには、ウェアラブル デバイスのバッテリー電力が低いことを考慮してください。画面がアクティブで、マップが表示された状態のままにすると、バッテリー消費量に影響します。