В этой статье рассказывается, как синхронизировать данные между устройством Wear OS и телефоном. Ознакомьтесь с общими рекомендациями о том, когда использовать API уровня данных, а когда – собственную инфраструктуру.
Отправка и синхронизация данных непосредственно из сети
Создавайте приложения Wear OS, которые напрямую взаимодействуют с сетью. Используйте те же API, что и при разработке для мобильных устройств, но учитывайте некоторые особенности Wear OS.
Как синхронизировать данные с помощью Wear OS Data Layer API
DataClient предоставляет API для чтения и записи данных в DataItem или Asset.
Вы можете задавать объекты данных и ресурсы, не подключаясь к устройствам. Они синхронизируются, когда устройства подключаются к сети. Эти данные доступны только вашему приложению на других устройствах.
DataItemсинхронизируется на всех устройствах в сети Wear OS. Они обычно небольшого размера.Используйте
Asset, чтобы передать более крупный объект, например изображение. Система отслеживает, какие объекты уже были перенесены, и автоматически удаляет дубликаты.
Как отслеживать события в сервисах
Продлить курс WearableListenerService. Система управляет жизненным циклом базового объекта WearableListenerService, подключаясь к сервису, когда нужно отправить элементы данных или сообщения, и отключаясь, когда работа не требуется.
Как отслеживать события в действиях
Реализуйте интерфейс OnDataChangedListener. Используйте этот интерфейс вместо WearableListenerService, если вы хотите отслеживать изменения только тогда, когда пользователь активно использует ваше приложение.
description: Передавайте большие двоичные объекты, например изображения, между телефонами Android и часами Wear OS с помощью объектов в Data Layer API. keywords_public: Wear OS, Data Layer API, объекты, передача данных по Bluetooth, синхронизация данных, DataMap, PutDataRequest
Как синхронизировать данные
Чтобы передавать большие двоичные объекты через Bluetooth, например голосовую запись с другого устройства, можно прикрепить Asset к элементу данных, а затем поместить этот элемент в реплицированное хранилище данных.
Примечание. Data Layer API может отправлять сообщения и синхронизировать данные только с телефонами Android и часами Wear OS. Если устройство Wear OS подключено к iOS-устройству, Data Layer API не будет работать.
По этой причине не используйте Data Layer API в качестве основного способа обмена данными с сетью. Вместо этого используйте в приложении для Wear OS тот же подход, что и в приложении для телефона, с небольшими отличиями, описанными в разделе Доступ к сети и синхронизация в Wear OS.
Объекты автоматически кэшируют данные, чтобы предотвратить повторную передачу и сэкономить пропускную способность Bluetooth. Часто приложение для телефона скачивает изображение, уменьшает его до размера, подходящего для показа на часах, и передает его приложению для часов как объект. Ниже приведены примеры такого поведения.
Как передать объект
Создайте объект, используя один из методов create...() в классе Asset. Преобразуйте растровое изображение в массив байтов, а затем вызовите метод createFromBytes(), чтобы создать объект, как показано в следующем примере.
private fun createAssetFromBitmap(bitmap: Bitmap): Asset = ByteArrayOutputStream().let { byteStream -> bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteStream) Asset.createFromBytes(byteStream.toByteArray()) }
Затем прикрепите объект к элементу данных с помощью метода putAsset() в DataMap или PutDataRequest. Затем поместите элемент данных в хранилище данных с помощью метода putDataItem(), как показано в следующих примерах.
В следующем примере используется метод 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 }
В следующем примере используется метод 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 }
Получение объектов
После создания объекта его обычно считывают и извлекают на другой стороне подключения. В следующем примере показано, как реализовать обратный вызов, чтобы обнаружить изменение объекта и извлечь его:
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 } }
Дополнительную информацию можно найти в примере проекта DataLayer на GitHub.