In diesem Dokument wird beschrieben, wie Sie Daten zwischen einem Wear OS-Gerät und einem Smartphone synchronisieren. In der Übersicht finden Sie Informationen dazu, wann Sie die Data Layer API und wann Sie Ihre Infrastruktur verwenden sollten.
Daten direkt aus dem Netzwerk senden und synchronisieren
Entwickeln Sie Wear OS-Apps, die direkt mit dem Netzwerk kommunizieren. Verwenden Sie dieselben APIs wie für die mobile Entwicklung, beachten Sie aber einige Wear OS-spezifische Unterschiede.
Daten mit der Wear OS Data Layer API synchronisieren
Ein DataClient stellt eine API für Komponenten bereit, mit der sie Daten in ein DataItem oder Asset lesen oder schreiben können.
Sie können Datenelemente und Assets festlegen, auch wenn keine Verbindung zu Geräten besteht. Sie werden synchronisiert, wenn die Geräte eine Netzwerkverbindung herstellen. Diese Daten sind privat für Ihre App und können nur von Ihrer App auf anderen Geräten aufgerufen werden.
Ein
DataItemwird auf allen Geräten in einem Wear OS-Netzwerk synchronisiert. Sie sind in der Regel klein.Verwenden Sie ein
Asset, um ein größeres Objekt wie ein Bild zu übertragen. Das System verfolgt, welche Assets bereits übertragen wurden, und führt automatisch eine Deduplizierung durch.
Auf Ereignisse in Diensten warten
Erweitern Sie die WearableListenerService Klasse. Das System verwaltet den Lebenszyklus des Basisdienstes WearableListenerService. Es stellt eine Verbindung zum Dienst her, wenn Datenelemente oder Nachrichten gesendet werden müssen, und trennt die Verbindung, wenn keine Arbeit erforderlich ist.
Auf Ereignisse in Aktivitäten warten
Implementieren Sie die OnDataChangedListener Schnittstelle. Verwenden Sie diese Schnittstelle anstelle von WearableListenerService, wenn Sie nur auf Änderungen warten möchten, wenn der Nutzer Ihre App aktiv verwendet.
description: Transfer large binary objects, such as images, between Android phones and Wear OS watches using Assets in the Data Layer API. keywords_public: Wear OS, Data Layer API, Assets, Bluetooth data transfer, data synchronization, DataMap, PutDataRequest
Daten synchronisieren
Wenn Sie große binäre Objekte über die Bluetooth-Verbindung freigeben möchten, z. B. eine Sprach
aufzeichnung von einem anderem Gerät, können Sie ein Asset an ein Daten
element anhängen und das Datenelement dann in den replizierten Datenspeicher einfügen. Wenn es sich jedoch um einen einmaligen Austausch zwischen zwei verbundenen Geräten handelt, sollten Sie prüfen, ob eine einfachere direkte Übertragung besser geeignet ist.
Hinweis:Mit der Data Layer API können nur Nachrichten gesendet und Daten mit Smartphones mit Android oder Wear OS-Smartwatches synchronisiert werden. Wenn ein Wear OS-Gerät mit einem iOS-Gerät gekoppelt ist, funktioniert die Data Layer API nicht.
Verwenden Sie die Data Layer API daher nicht als primäre Methode zur Kommunikation mit einem Netzwerk. Folgen Sie stattdessen in Ihrer Wear OS-App demselben Muster wie in einer Smartphone-App. Es gibt jedoch einige geringfügige Unterschiede, die unter Netzwerkzugriff und Synchronisierung unter Wear OS beschrieben werden.
Assets verarbeiten das Caching von Daten automatisch, um eine erneute Übertragung zu verhindern und Bluetooth-Bandbreite zu sparen. Ein häufiges Muster ist, dass eine Smartphone-App ein Bild herunterlädt, es auf eine geeignete Größe für die Anzeige auf der Smartwatch verkleinert und es als Asset für die Smartwatch-App freigibt. Die folgenden Beispiele veranschaulichen dieses Muster.
Asset übertragen
Erstellen Sie das Asset mit einer der create...() Methoden in der
Asset Klasse. Konvertieren Sie eine Bitmap in ein Byte-Array und rufen Sie dann
createFromBytes() auf, um das Asset zu erstellen, wie im folgenden
Beispiel gezeigt.
private fun createAssetFromBitmap(bitmap: Bitmap): Asset = ByteArrayOutputStream().let { byteStream -> bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteStream) Asset.createFromBytes(byteStream.toByteArray()) }
Hängen Sie das Asset als Nächstes mit der putAsset() Methode in
DataMap oder PutDataRequest an ein Datenelement an. Fügen Sie das Datenelement dann in
den Datenspeicher ein, indem Sie die putDataItem() Methode verwenden, wie in den
folgenden Beispielen gezeigt.
Im folgenden Beispiel wird PutDataRequest verwendet:
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 }
Im folgenden Beispiel wird PutDataMapRequest verwendet:
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 }
Assets empfangen
Nachdem Sie ein Asset erstellt haben, lesen und extrahieren Sie es in der Regel auf der anderen Seite der Verbindung. Im folgenden Beispiel wird gezeigt, wie Sie den Callback implementieren, um eine Asset-Änderung zu erkennen und das Asset zu extrahieren:
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 } }
Weitere Informationen finden Sie im DataLayer-Beispielprojekt auf GitHub.