En este documento, se describe cómo sincronizar datos entre un dispositivo Wear OS y un teléfono. Consulta la guía general para saber cuándo usar la API de Data Layer y cuándo usar tu infraestructura.
Envía y sincroniza datos directamente desde la red
Compila apps para Wear OS para comunicarte directamente con la red. Usa las mismas APIs que usas para el desarrollo en dispositivos móviles, pero ten en cuenta algunas diferencias específicas de Wear OS.
Sincroniza datos con la API de Wear OS Data Layer
Un DataClient expone una API para que los componentes lean o escriban en un DataItem o Asset.
Es posible configurar elementos de datos y recursos mientras no tienes conexión a ningún dispositivo. Se sincronizan cuando los dispositivos establecen una conexión de red. Estos datos son privados para tu app y solo tu app puede acceder a ellos en otros dispositivos.
Un
DataItemse sincroniza en todos los dispositivos de una red de Wear OS. Por lo general, son de tamaño pequeño.Usa un
Assetpara transferir un objeto más grande, como una imagen. El sistema realiza un seguimiento de los recursos que ya se transfirieron y elimina los duplicados automáticamente.
Cómo detectar eventos en los servicios
Extiende la clase WearableListenerService. El sistema administra el ciclo de vida del WearableListenerService base, vincula al servicio cuando necesita enviar elementos de datos o mensajes y desvincula el servicio cuando no es necesario realizar tareas.
Cómo detectar eventos en actividades
Implementa la interfaz OnDataChangedListener. Usa esta interfaz en lugar de WearableListenerService cuando quieras escuchar cambios solo cuando el usuario use activamente tu app.
description: Transfiere objetos binarios grandes, como imágenes, entre teléfonos Android y relojes Wear OS con Assets en la API de Data Layer. keywords_public: Wear OS, API de Data Layer, Assets, transferencia de datos por Bluetooth, sincronización de datos, DataMap, PutDataRequest
Cómo sincronizar datos
Para compartir objetos binarios grandes a través de Bluetooth, como una grabación de voz desde otro dispositivo, puedes adjuntar un Asset a un elemento de datos y, luego, colocar ese elemento en el almacén de datos replicado. Sin embargo, si el intercambio es único entre dos dispositivos conectados, considera si una transferencia directa más simple es más adecuada.
Nota: La API de Data Layer solo puede enviar mensajes y sincronizar datos con teléfonos que ejecutan Android o relojes Wear OS. Si un dispositivo Wear OS está vinculado con un dispositivo iOS, la API de Data Layer no funcionará.
Por este motivo, no uses la API de Data Layer como método principal para comunicarte con una red. En su lugar, sigue el mismo patrón en tu app para Wear OS que en una app para teléfonos, con algunas diferencias leves, como se describe en Acceso a la red y sincronización en Wear OS.
Los recursos manejan automáticamente el almacenamiento en caché de datos para evitar la retransmisión y conservar el ancho de banda de Bluetooth. Un patrón común es que una app para teléfonos descargue una imagen, reduzca su tamaño a uno apropiado para mostrarla en el reloj y la comparta con la app para relojes como un recurso. En los siguientes ejemplos, se muestra este patrón.
Cómo transferir un recurso
Crea el recurso usando uno de los métodos create...() en la clase Asset. Convierte un mapa de bits en un array de bytes y, luego, llama a createFromBytes() para crear el recurso, como se muestra en el siguiente ejemplo.
private fun createAssetFromBitmap(bitmap: Bitmap): Asset = ByteArrayOutputStream().let { byteStream -> bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteStream) Asset.createFromBytes(byteStream.toByteArray()) }
Luego, adjunta el recurso a un elemento de datos con el método putAsset() en DataMap o PutDataRequest. Luego, coloca el elemento de datos en el almacén de datos con el método putDataItem(), como se muestra en los siguientes ejemplos.
En el siguiente ejemplo, se usa PutDataRequest:
private fun Context.sendImagePutDataRequest(): Task<DataItem> { val asset: Asset = createAssetFromBitmap(BitmapFactory.decodeResource(resources, R.drawable.ic_walk)) val request: PutDataRequest = PutDataRequest.create("/image").apply { putAsset("profileImage", asset) } val putTask: Task<DataItem> = Wearable.getDataClient(this).putDataItem(request) return putTask }
En el siguiente ejemplo, se usa PutDataMapRequest:
private fun Context.sendImagePutDataMapRequest(): Task<DataItem> { val asset: Asset = createAssetFromBitmap(BitmapFactory.decodeResource(resources, R.drawable.ic_walk)) val request: PutDataRequest = PutDataMapRequest.create("/image").run { dataMap.putAsset("profileImage", asset) asPutDataRequest() } val putTask: Task<DataItem> = Wearable.getDataClient(this).putDataItem(request) return putTask }
Cómo recibir recursos
Después de crear un recurso, por lo general, lo lees y extraes en el otro extremo de la conexión. En el siguiente ejemplo, se muestra cómo implementar la devolución de llamada para detectar un cambio de recurso y extraerlo:
override fun onDataChanged(dataEvents: DataEventBuffer) { dataEvents .filter { it.type == DataEvent.TYPE_CHANGED && it.dataItem.uri.path == "/image" } .forEach { event -> val asset = DataMapItem.fromDataItem(event.dataItem) .dataMap.getAsset("profileImage") asset?.let { safeAsset -> lifecycleScope.launch { val bitmap = loadBitmapFromAsset(safeAsset) // Do something with the bitmap } } } } private suspend fun loadBitmapFromAsset(asset: Asset): Bitmap? = withContext(Dispatchers.IO) { try { val assetResult = Wearable.getDataClient(this@DataLayerActivity2) .getFdForAsset(asset) .await() assetResult?.inputStream?.use { inputStream -> BitmapFactory.decodeStream(inputStream) } } catch (e: Exception) { e.printStackTrace() null } }
Para obtener más información, consulta el proyecto de muestra de DataLayer en GitHub.