6 月 3 日の「#Android11: The Beta Launch Show」にぜひご参加ください。

ウォッチフェイス サービスを構築する

ウォッチフェイスは、Wear OS アプリにパッケージされているサービスです。ユーザーが利用可能なウォッチフェイスを選択すると、ウォッチフェイスが表示され、サービスのコールバック メソッドが呼び出されます。

ウォッチフェイスがパッケージされている Wear OS アプリをインストールすると、ユーザーはスマートウォッチでウォッチフェイス選択ツールを使用してウォッチフェイスを選択できます。また、ペア設定されているスマートフォンのコンパニオン アプリでも、ウォッチフェイスを選択できます。

このページでは、Wear OS プロジェクトを設定してウォッチフェイスを追加する方法と、ウォッチフェイス サービスを実装する方法について説明します。

ウォッチフェイス プロジェクトを作成する

Android Studio でウォッチフェイスのプロジェクトを作成するには:

  1. [File] > [New] > [New project] をクリックします。
  2. [Create Android Project] ウィンドウでデフォルト値を受け入れ、[Next] をクリックします。
  3. [Target Android Devices] ウィンドウで [Wear] オプションのみを選択し、SDK バージョンのリストで使用可能な最新のバージョンを選択して、[Next] をクリックします。
  4. [Add an Activity to Wear] ウィンドウで [Watch Face] を選択して、[Next] をクリックします。
  5. [Configure Activity] ウィンドウでデフォルト値を受け入れ、[Finish] をクリックします。

Android Studio は、ウォッチフェイス サービス用の app モジュールを使用してプロジェクトを作成します。Android Studio のプロジェクトについて詳しくは、プロジェクトの作成をご覧ください。

依存関係

ウェアラブル サポート ライブラリには、拡張してウォッチフェイス実装の作成に使用する必須のクラスが含まれています。Wearable Data Layer API を使用してコンパニオン デバイスとウェアラブルの間でデータアイテムを同期するには、Google Play 開発者サービスのクライアント ライブラリ(play-servicesplay-services-wearable)が必要です。

上記の手順に従ってプロジェクトを作成すると、必要なエントリが Android Studio によって build.gradle ファイルに自動的に追加されます。

ウェアラブル サポート ライブラリ API リファレンス

リファレンス ドキュメントには、ウォッチフェイスを実装する際に使用するクラスについての詳細な情報が記載されています。ウェアラブル サポート ライブラリについては、API リファレンス ドキュメントをご覧ください。

注: Wear OS の開発には Android Studio を使用することをおすすめします。Android Studio では、プロジェクトのセットアップ、ライブラリのインクルード、パッケージングを容易に行うことができます。

権限を宣言する

ウォッチフェイスには WAKE_LOCK 権限が必要です。Wear OS アプリ(ウェアラブル アプリ)とモバイル(スマートフォン)アプリの両方のマニフェスト ファイルで、manifest 要素に以下の権限を追加します。

    <manifest ...>
        <uses-permission
            android:name="android.permission.WAKE_LOCK" />

        <!-- Required for complications to receive complication data and open the provider chooser. -->
        <uses-permission
            android:name="com.google.android.wearable.permission.RECEIVE_COMPLICATION_DATA"/>
        ...
    </manifest>
    

注意: ハンドヘルド アプリには、ウェアラブル アプリで宣言したすべての権限を含める必要があります。

サービスとコールバック メソッドを実装する

Wear OS のウォッチフェイスはサービスとして実装されます。ウォッチフェイスがアクティブな場合、時刻が変わったときや、重要なイベントが発生したとき(たとえば、常に画面表示モードに切り替わったときや新しい通知を受け取ったとき)に、システムはサービス内のメソッドを呼び出します。サービスの実装は、更新された時刻とその他の関連データを使用して、ウォッチフェイスを画面上に描画します。

ウォッチフェイスを実装するには、CanvasWatchFaceService クラスと CanvasWatchFaceService.Engine クラスを拡張し、次に CanvasWatchFaceService.Engine クラスのコールバック メソッドをオーバーライドします。これらのクラスはウェアラブル サポート ライブラリに含まれています。

次のスニペットは、実装する必要がある主なメソッドの概要を示しています。

Kotlin

    class AnalogWatchFaceService : CanvasWatchFaceService() {

        override fun onCreateEngine(): Engine {
            /* provide your watch face implementation */
            return Engine()
        }

        /* implement service callback methods */
        inner class Engine : CanvasWatchFaceService.Engine() {

            override fun onCreate(holder: SurfaceHolder) {
                super.onCreate(holder)
                /* initialize your watch face */
            }

            override fun onPropertiesChanged(properties: Bundle?) {
                super.onPropertiesChanged(properties)
                /* get device features (burn-in, low-bit ambient) */
            }

            override fun onTimeTick() {
                super.onTimeTick()
                /* the time changed */
            }

            override fun onAmbientModeChanged(inAmbientMode: Boolean) {
                super.onAmbientModeChanged(inAmbientMode)
                /* the wearable switched between modes */
            }

            override fun onDraw(canvas: Canvas, bounds: Rect) {
                /* draw your watch face */
            }

            override fun onVisibilityChanged(visible: Boolean) {
                super.onVisibilityChanged(visible)
                /* the watch face became visible or invisible */
            }
        }
    }
    

Java

    public class AnalogWatchFaceService extends CanvasWatchFaceService {

        @Override
        public Engine onCreateEngine() {
            /* provide your watch face implementation */
            return new Engine();
        }

        /* implement service callback methods */
        private class Engine extends CanvasWatchFaceService.Engine {

            @Override
            public void onCreate(SurfaceHolder holder) {
                super.onCreate(holder);
                /* initialize your watch face */
            }

            @Override
            public void onPropertiesChanged(Bundle properties) {
                super.onPropertiesChanged(properties);
                /* get device features (burn-in, low-bit ambient) */
            }

            @Override
            public void onTimeTick() {
                super.onTimeTick();
                /* the time changed */
            }

            @Override
            public void onAmbientModeChanged(boolean inAmbientMode) {
                super.onAmbientModeChanged(inAmbientMode);
                /* the wearable switched between modes */
            }

            @Override
            public void onDraw(Canvas canvas, Rect bounds) {
                /* draw your watch face */
            }

            @Override
            public void onVisibilityChanged(boolean visible) {
                super.onVisibilityChanged(visible);
                /* the watch face became visible or invisible */
            }
        }
    }
    

CanvasWatchFaceService クラスは、View.invalidate() メソッドに似た無効化メカニズムを提供します。システムにウォッチフェイスを再描画させたい場合は、実装のあらゆる場所で invalidate() メソッドを呼び出すことができます。invalidate() メソッドは、メイン UI スレッドでのみ使用できます。別のスレッドからキャンバスを無効化するには、postInvalidate() メソッドを呼び出します。

CanvasWatchFaceService.Engine クラスのメソッドの実装について詳しくは、ウォッチフェイスを描画するをご覧ください。

ウォッチフェイス サービスを登録する

ウォッチフェイス サービスを実装したら、ウェアラブル アプリのマニフェスト ファイルに実装を登録します。ユーザーがこのアプリをインストールすると、システムはサービスに関する情報を使用して、Wear OS のコンパニオン アプリと、ウェアラブル デバイスのウォッチフェイス選択ツールで、ウォッチフェイスを選択できるようにします。

次のスニペットは、application 要素にウォッチフェイスの実装を登録する方法を示しています。

    <service
        android:name=".AnalogWatchFaceService"
        android:label="@string/analog_name"
        android:permission="android.permission.BIND_WALLPAPER" >
        <meta-data
            android:name="android.service.wallpaper"
            android:resource="@xml/watch_face" />
        <meta-data
            android:name="com.google.android.wearable.watchface.preview"
            android:resource="@drawable/preview_analog" />
        <meta-data
            android:name="com.google.android.wearable.watchface.preview_circular"
            android:resource="@drawable/preview_analog_circular" />
        <intent-filter>
            <action android:name="android.service.wallpaper.WallpaperService" />
            <category
                android:name=
                "com.google.android.wearable.watchface.category.WATCH_FACE" />
        </intent-filter>
    </service>
    

Wear OS のコンパニオン アプリと、ウェアラブル デバイスのウォッチフェイス選択ツールは、デバイスにインストールされているすべてのウォッチフェイスをユーザーに提示する際に、com.google.android.wearable.watchface.preview メタデータ エントリで定義されているプレビュー画像を使用します。このドローアブルを取得するには、Wear OS デバイスまたはエミュレータ インスタンスでウォッチフェイスを実行し、スクリーンショットを撮ります。hdpi 画面を持つ Wear OS デバイスでは、プレビュー画像のサイズは通常、320 x 320 ピクセルです。

円形のデバイスでは外観が大きく異なるウォッチフェイスの場合は、円形と正方形の両方のプレビュー画像を指定できます。円形のプレビュー画像を指定するには、com.google.android.wearable.watchface.preview_circular メタデータ エントリを使用します。ウォッチフェイスに両方のプレビュー画像を指定した場合、コンパニオン アプリと、ウェアラブルのウォッチフェイス選択ツールは、スマートウォッチの形状に応じて適切なプレビュー画像を表示します。円形のプレビュー画像が含まれていない場合、正方形と円形の両方のデバイスで正方形のプレビュー画像が使用されます。正方形のプレビュー画像は、円形のデバイスでは円形に切り取られます。

android.service.wallpaper メタデータ エントリには、wallpaper 要素を含む watch_face.xml リソース ファイルを指定します。

    <?xml version="1.0" encoding="UTF-8"?>
    <wallpaper xmlns:android="http://schemas.android.com/apk/res/android" />
    

ウェアラブル アプリには複数のウォッチフェイスを含めることができます。そのためには、ウォッチフェイスの実装ごとに、ウェアラブル アプリのマニフェスト ファイルにサービス エントリを追加する必要があります。