Cómo crear un servicio para caras de reloj

Una cara de reloj es un servicio empaquetado en una app para Wear OS. Cuando un usuario selecciona una cara de reloj disponible, se muestra dicha cara y se invocan los métodos de devolución de llamada del servicio.

Cuando un usuario instala una app para Wear que tiene caras de reloj, estas están disponibles en el reloj por medio del selector de caras de reloj. De manera alternativa, el usuario puede seleccionar una cara de reloj desde una app complementaria en el teléfono vinculado.

En esta página, se describe la configuración de un proyecto de Wear OS para incluir caras de reloj y la implementación de un servicio de caras de reloj.

Cómo crear un proyecto de cara de reloj

Nota: Te recomendamos usar Android Studio para el desarrollo de Wear OS, ya que proporciona elementos prácticos de configuración de proyectos, inclusión de bibliotecas y empaquetado.

Completa los siguientes pasos para crear un proyecto en Android Studio para tu cara de reloj:

  1. Haz clic en File > New > New Project.
  2. En la ventana Select a project template, selecciona la pestaña Wear y Watch Face en la lista de opciones y haz clic en Next.
  3. En la ventana Configure your project, acepta los valores predeterminados y haz clic en Finish.

Android Studio crea un proyecto con un módulo app para tu servicio de cara de reloj.

Dependencias

Android Studio agrega automáticamente las entradas obligatorias en los archivos build.gradle. En las dependencias, se incluye la biblioteca de caras de reloj de AndroidX. Consulta la muestra de código en GitHub para obtener detalles sobre esta biblioteca.

Referencia de la API de la biblioteca de compatibilidad de wearables

En la documentación de referencia, se proporciona información detallada sobre las clases que usas para implementar caras de reloj. Consulta la documentación de referencia de la API de la biblioteca de compatibilidad de wearables.

Cómo declarar permisos

Una cara de reloj requiere el permiso WAKE_LOCK. Agrega el siguiente permiso a los archivos de manifiesto de la app para Wear OS y la app para teléfonos celulares en el elemento 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>

Cómo admitir dispositivos rectangulares

De forma predeterminada, las caras de reloj en dispositivos rectangulares se ejecutan en un modo de emulación cuadrada para admitir caras de reloj creadas para dispositivos circulares y cuadrados. Si deseas admitir dispositivos rectangulares por completo, anula este comportamiento con la creación de una etiqueta meta-data en la cara de reloj service de manifest y la configuración de android.service.wallpaper.square_mode en false, como se indica en la siguiente muestra de código:

<manifest ...>
    <application ...>
        <service
            android:name=".MyWatchFace"
            android:label="My Watch Face"
            android:permission="android.permission.BIND_WALLPAPER">
            ...
            <meta-data
                android:name="android.service.wallpaper.square_mode"
                android:value="false" />
            ...
        </service>
    ...
    </application>
    ...
</manifest>

Cómo implementar el servicio y los métodos de devolución de llamada

Las caras de reloj en Wear OS se implementan como WatchFaceService. La implementación de WatchFaceService requiere la creación de tres objetos: UserStyleSchema, ComplicationSlotsManager y WatchFace.

Estos tres objetos se especifican mediante la anulación de tres métodos abstractos de WatchFaceService, que se muestran en el siguiente ejemplo:

Kotlin

class CustomWatchFaceService : WatchFaceService() {

    /**
     * The specification of settings the watch face supports.
     * This is similar to a database schema.
     */
    override fun createUserStyleSchema(): UserStyleSchema = // ...

    /**
     * The complication slot configuration for the watchface.
     */
    override fun createComplicationSlotsManager(
        currentUserStyleRepository: CurrentUserStyleRepository
    ): ComplicationSlotsManager = // ...

    /**
     * The watch face itself, which includes the renderer for drawing.
     */
    override suspend fun createWatchFace(
        surfaceHolder: SurfaceHolder,
        watchState: WatchState,
        complicationSlotsManager: ComplicationSlotsManager,
        currentUserStyleRepository: CurrentUserStyleRepository
    ): WatchFace = // ...

}

Cómo registrar el servicio de caras de reloj

Después de implementar el servicio de caras de reloj, registra la implementación en el archivo de manifiesto de la app para wearables. Cuando los usuarios instalan esta app, el sistema usa la información sobre el servicio a fin de que la cara de reloj esté disponible en la app complementaria de Wear OS y en el selector de caras de reloj en el dispositivo wearable.

El siguiente fragmento muestra el modo en que se registra una implementación de cara de reloj en el elemento <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>

La aplicación complementaria de Wear OS by Google y el selector de caras de reloj en el dispositivo wearable usan la imagen de vista previa definida por la entrada de metadatos com.google.android.wearable.watchface.preview cuando presentan a los usuarios todas las caras de reloj instaladas en el dispositivo. Para obtener este elemento de diseño, ejecuta la cara de reloj en tu dispositivo Wear OS o en una instancia de emulador y toma una captura de pantalla. En los dispositivos para Wear con pantallas hdpi, la imagen de vista previa suele tener un tamaño de 320 x 320 píxeles.

Las caras de reloj que se ven muy diferentes en los dispositivos redondos pueden proporcionar imágenes de vista previa redondas y cuadradas. Para especificar una imagen de vista previa redonda, usa la entrada de metadatos com.google.android.wearable.watchface.preview_circular. Si la cara de reloj incluye ambas imágenes de vista previa, la app complementaria y el selector de caras de reloj en el wearable muestran la adecuada según la forma del reloj. Si no se incluye una imagen de vista previa redonda, la imagen de vista previa cuadrada se utiliza para dispositivos tanto cuadrados como redondos. Para dispositivos redondos, una imagen de vista previa cuadrada se recorta con una forma circular.

La entrada de metadatos android.service.wallpaper especifica el archivo de recursos watch_face.xml, que contiene un elemento wallpaper, como se muestra en el siguiente fragmento:

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

Tu app para wearables puede incluir más de una cara de reloj. Debes agregar una entrada de servicio al archivo de manifiesto de la app para wearables para cada una de las implementaciones de la cara de reloj.

Consulta los siguientes recursos relacionados: