ウィジェットを使ってみる

前提条件と設定

始める前に、環境が次の要件を満たしていることを確認してください。

ランタイム要件

Wear ウィジェットを使用するには、対象デバイスに com.google.android.wearable.protolayout.renderer APK のバージョン 1.6.1 以降 が必要です。

互換性のあるバージョンのレンダラは、次のいずれかの方法で入手できます。

  • Wear OS 7 エミュレータ: Wear OS 7 エミュレータ イメージを使用します。バージョン 7 より前のものは適していません。設定手順については、Wear OS 7 エミュレータを設定するをご覧ください。
  • 物理デバイス: Google Play ストアから自動 更新を受け取る物理的な Wear OS デバイス、または Google Play ストアにログインしているデベロッパー デバイスを使用します。

デバイスにインストールされているバージョンを確認するには、次のコマンドを使用します。

adb shell dumpsys package com.google.android.wearable.protolayout.renderer | \
  grep -m 1 versionName | \
  awk -F= '{print $2}'

Gradle 構成

Wear ウィジェット ライブラリは Google Maven で入手できます。

1. SDK バージョンを構成する

compileSdktargetSdk37 以上に設定されていることを確認します。

android {
    compileSdk = 37
    // ...
    defaultConfig {
        targetSdk = 37
        // ...
    }
}

**2. 依存関係を追加する

アプリの build.gradle.kts ファイルに次の依存関係を追加します。

Groovy

dependencies {
    // Core Wear Widget and Remote Compose libraries
    implementation "androidx.compose.remote:remote-creation-compose:1.0.0-alpha16"
    implementation "androidx.compose.remote:remote-core:1.0.0-alpha16"
    implementation "androidx.glance.wear:wear:1.0.0-alpha15"
    implementation "androidx.glance.wear:wear-core:1.0.0-alpha15"
    implementation "androidx.wear.compose.remote:remote-material3:1.0.0-alpha08"

    // Tooling for previews (optional, but recommended)
    implementation "androidx.compose.remote:remote-tooling-preview:1.0.0-alpha16"
    implementation "androidx.wear.compose:compose-ui-tooling:1.6.2"
    implementation "androidx.wear.tiles:tiles-tooling-preview:1.6.2"
    debugImplementation "androidx.wear.tiles:tiles-renderer:1.6.2"
}

Kotlin

dependencies {
    // Core Wear Widget and Remote Compose libraries
    implementation("androidx.compose.remote:remote-creation-compose:1.0.0-alpha16")
    implementation("androidx.compose.remote:remote-core:1.0.0-alpha16")
    implementation("androidx.glance.wear:wear:1.0.0-alpha15")
    implementation("androidx.glance.wear:wear-core:1.0.0-alpha15")
    implementation("androidx.wear.compose.remote:remote-material3:1.0.0-alpha08")

    // Tooling for previews (optional, but recommended)
    implementation("androidx.compose.remote:remote-tooling-preview:1.0.0-alpha16")
    implementation("androidx.wear.compose:compose-ui-tooling:1.6.2")
    implementation("androidx.wear.tiles:tiles-tooling-preview:1.6.2")
    debugImplementation("androidx.wear.tiles:tiles-renderer:1.6.2")
}

Hello World ウィジェットを作成する

Wear ウィジェットは、 GlanceWearWidgetService を拡張するサービスと、 拡張する GlanceWearWidget ウィジェット クラスで構成されます。UI は @RemoteComposable 関数を使用して定義します。

サービスを定義する

サービスは、システムがバインドするエントリ ポイントです。

ウィジェットを定義するには、GlanceWearWidgetService を拡張するサービスを作成します。

@AssociateWithGlanceWearWidget(HelloWidget::class)
class HelloWidgetService : GlanceWearWidgetService() {
    override val widget: GlanceWearWidget = HelloWidget()
}

ウィジェットを定義する

ウィジェット クラスは、ウィジェットのデータとレイアウトを提供します。

class HelloWidget : GlanceWearWidget() {
    override suspend fun provideWidgetData(
        context: Context,
        params: WearWidgetParams,
    ): WearWidgetData {
        return WearWidgetDocument(
            background = WearWidgetBrush.color(Color.Blue.rc),
        ) {
            HelloWidgetContent()
        }
    }
}

コンテンツを定義する

コンテンツは、Remote Compose コンポーネントを使用して作成されます。

@RemoteComposable
@Composable
fun HelloWidgetContent() {
    RemoteBox(
        modifier = RemoteModifier.fillMaxSize(),
        contentAlignment = RemoteAlignment.Center,
    ) {
        RemoteText(
            text = "Hello World".rs,
            color = Color.White.rc,
        )
    }
}

Android Studio でウィジェットをプレビューする

androidx.glance.wear:wear-tooling-preview を使用すると、Android Studio の [Design] パネルでウィジェット レイアウトを直接プレビューできます。

事前定義されたプレビュー スイート

wear-tooling-preview ライブラリには、さまざまなコンテナの形状とデバイス構成でレイアウトをテストするための事前定義された PreviewParameterProvider スイートが用意されています。

  • スクワークル スイート(SquircleAllWidgetPreviewParams): 丸みを帯びた長方形のコンテナ。
  • ラウンド スイート(RoundAllWidgetPreviewParams): ピル型のコンテナ。
  • 長方形スイート(RectangularAllWidgetPreviewParams): セーフ パディングを含む、切り抜かれていない長方形のコンテナ。この プレビュー構成で生成された画像は、ウィジェット ピッカーで使用される APK 埋め込みプレビュー 画像として使用するのに適しています( プレビュー画像アセットを生成するをご覧ください)。

Android Studio でウィジェットをプレビューするには、@WearWidgetPreview を使用します。

@Preview
@Composable
fun HelloWidgetPreview(
    @PreviewParameter(SquircleAllWidgetPreviewParams::class) params: WearWidgetParams,
) {
    WearWidgetPreview(
        widget = HelloWidget(),
        params = params,
    )
}

ウィジェット構成 XML を作成する

新しいファイル res/xml/hello_widget_info.xml を作成して、ウィジェットのプロパティとサポートされているサイズを定義します。<wearwidget-provider> タグでサポートされている XML 属性の完全なリファレンスについては、 WearWidgetProviderInfo ドキュメントをご覧ください。

<wearwidget-provider
    description="@string/hello_widget_description"
    icon="@mipmap/ic_launcher"
    label="@string/hello_widget_label"
    preferredType="SMALL">

    <container
        type="SMALL"
        previewImage="@drawable/widget_preview_small" />
    <container
        type="LARGE"
        previewImage="@drawable/widget_preview_large" />
</wearwidget-provider>

プレビュー画像アセットを生成する

<container> 要素の previewImage 属性は、システム ウィジェット ピッカーに表示されるドローアブル アセット を参照します。正しい境界と密度でプレビュー アセットを生成するには、RectangularAllWidgetPreviewParams(小規模コンテナと大規模コンテナの両方のプレビュー バリアントを生成します)を使用して Android Studio プレビューを使用し、320 DPI のスマートウォッチ ディスプレイ密度を指定します。

@Preview(
    name = "Widget Preview Asset",
    device = "spec:width=1000dp,height=1000dp,dpi=320",
)
@Composable
fun HelloWidgetCatalogPreview(
    @PreviewParameter(RectangularAllWidgetPreviewParams::class) params: WearWidgetParams,
) {
    WearWidgetPreview(
        widget = HelloWidget(),
        params = params,
    )
}

レンダリングされたプレビュー画像を抽出する手順は次のとおりです。

  1. Android Studio で、プレビュー コンポーザブルの [Design] サーフェスを開きます。
  2. プレビュー ウィンドウで、レンダリングされたプレビューを右クリックするか、プレビュー ツールバーを使用して [Copy Image] を選択するか、画像を保存します。または、CLI ツールまたは自動化スクリプトを使用して Compose プレビューを抽出します。
  3. 小規模画像ファイルと大規模画像ファイルをアプリの res/drawable-nodpi/ ディレクトリ(res/drawable-nodpi/widget_preview_small.pngres/drawable-nodpi/widget_preview_large.png など)に保存します。

AndroidManifest.xml に登録する

必要なインテント フィルタとメタデータを使用して、AndroidManifest.xml にサービスを登録します。

<service
    android:name=".snippets.widget.HelloWidgetService"
    android:exported="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/hello_widget_label"
    android:permission="com.google.android.wearable.permission.BIND_TILE_PROVIDER">

    <intent-filter>
        <action android:name="androidx.glance.wear.action.BIND_WIDGET_PROVIDER" />
        <!-- If you already have a Tile, omit the following line. -->
        <action android:name="androidx.wear.tiles.action.BIND_TILE_PROVIDER" />
    </intent-filter>

    <meta-data
        android:name="androidx.glance.wear.widget.provider"
        android:resource="@xml/hello_widget_info" />

    <meta-data
        android:name="androidx.wear.tiles.PREVIEW"
        android:resource="@drawable/tile_preview" />
</service>

ビルドとデプロイ

サービスとウィジェットを定義したら、プロジェクトをビルドしてデバイスまたはエミュレータにデプロイできます。

ビルドしてインストールする

プロジェクトをビルドし、接続されたデバイスまたはエミュレータにデバッグ APK をインストールします。

./gradlew :app:installDebug

ウィジェットを追加してプレビューする

アプリがインストールされたら、adb を使用してウィジェットをプログラムでカルーセルに追加し、画面に表示します。

注: Wear ウィジェットは、デバッグ目的で基盤となるタイル インフラストラクチャを使用します。そのため、adb コマンドには add-tile オペレーションと show-tile オペレーションが必要です。

1. ウィジェットをカルーセルに追加します。

adb shell am broadcast \
  -a com.google.android.wearable.app.DEBUG_SURFACE \
  --es operation add-tile \
  --ecn component <your_package_name>/.HelloWidgetService

**2. ウィジェットを表示します。

adb shell am broadcast \
  -a com.google.android.wearable.app.DEBUG_SYSUI \
  --es operation show-tile \
  --ei index 0