Verileri senkronize et

Bu belgede, Wear OS cihaz ile telefon arasındaki verilerin nasıl senkronize edileceği açıklanmaktadır. Veri katmanı API'sinin ve altyapınızın ne zaman kullanılacağıyla ilgili genel bakış kılavuzuna bakın.

Verileri doğrudan ağdan gönderme ve senkronize etme

Doğrudan ağla iletişim kurmak için Wear OS uygulamaları oluşturun. Mobil geliştirme için kullandığınız API'leri kullanın ancak Wear OS'e özgü bazı farklılıkları göz önünde bulundurun.

Wear OS Data Layer API'yi kullanarak verileri senkronize etme

Bir DataClient, bileşenlerin DataItem veya Asset'ye okuma ya da yazma işlemi yapması için bir API sunar.

Herhangi bir cihaza bağlı değilken veri öğelerini ve öğeleri ayarlayabilirsiniz. Cihazlar ağ bağlantısı kurduğunda senkronize edilir. Bu veriler uygulamanıza özeldir ve diğer cihazlarda yalnızca uygulamanız tarafından erişilebilir.

  • Bir DataItem, Wear OS ağındaki tüm cihazlarda senkronize edilir. Genellikle küçük boyutludurlar.

  • Resim gibi daha büyük bir nesneyi aktarmak için Asset simgesini kullanın. Sistem, hangi öğelerin aktarıldığını takip eder ve otomatik olarak yinelenen öğeleri kaldırır.

Hizmetlerdeki etkinlikleri dinleme

WearableListenerService sınıfını genişletin. Sistem, temel WearableListenerService'nın yaşam döngüsünü yönetir. Veri öğeleri veya mesajlar göndermesi gerektiğinde hizmete bağlanır, iş gerekmediğinde ise hizmetin bağlantısını kaldırır.

Etkinliklerdeki etkinlikleri dinleme

OnDataChangedListener arayüzünü uygulayın. Yalnızca kullanıcı uygulamanızı etkin olarak kullanırken değişiklikleri dinlemek istediğinizde WearableListenerService yerine bu arayüzü kullanın.

Data Layer API'deki Öğeleri kullanarak Android telefonlar ve Wear OS kol saatleri arasında resim gibi büyük ikili nesneleri aktarın.

Verileri senkronize etme

Bluetooth üzerinden büyük ikili nesneleri (ör. başka bir cihazdaki ses kaydı) paylaşmak için bir veri öğesine Asset ekleyebilir ve ardından veri öğesini çoğaltılmış veri deposuna yerleştirebilirsiniz. Ancak, değişim iki bağlı cihaz arasında tek seferlik bir değişimse daha basit bir doğrudan aktarımın daha uygun olup olmadığını değerlendirin.

Not: Veri Katmanı API'si yalnızca Android veya Wear OS yüklü telefonlara mesaj gönderebilir ve verileri bu cihazlarla senkronize edebilir. Bir Wear OS cihazı iOS cihazla eşlenmişse Data Layer API çalışmaz.

Bu nedenle, Veri Katmanı API'sini bir ağla iletişim kurmanın birincil yolu olarak kullanmayın. Bunun yerine, Wear OS'te ağ erişimi ve senkronizasyon bölümünde açıklandığı gibi, Wear OS uygulamanızda telefon uygulamasındakiyle aynı deseni izleyin (bazı küçük farklılıklar olabilir).

Öğeler, yeniden iletimi önlemek ve Bluetooth bant genişliğini korumak için verilerin önbelleğe alınmasını otomatik olarak gerçekleştirir. Telefon uygulamaları genellikle bir resmi indirir, saatin ekranında gösterilecek uygun boyuta küçültür ve öğe olarak saat uygulamasıyla paylaşır. Aşağıdaki örneklerde bu kalıp gösterilmektedir.

Öğe aktarma

Asset sınıfındaki create...() yöntemlerinden birini kullanarak öğeyi oluşturun. Bir bit eşlemi bayt dizisine dönüştürün ve ardından aşağıdaki örnekte gösterildiği gibi öğeyi oluşturmak için createFromBytes() işlevini çağırın.

private fun createAssetFromBitmap(bitmap: Bitmap): Asset =
    ByteArrayOutputStream().let { byteStream ->
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteStream)
        Asset.createFromBytes(byteStream.toByteArray())
    }

Ardından, öğeyi DataMap veya PutDataRequest içinde putAsset() yöntemiyle bir veri öğesine ekleyin. Ardından, aşağıdaki örneklerde gösterildiği gibi putDataItem() yöntemini kullanarak veri öğesini veri deposuna yerleştirin.

Aşağıdaki örnekte PutDataRequest kullanılmıştır:

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
}

Aşağıdaki örnekte PutDataMapRequest kullanılmıştır:

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
}

Öğe alma

Bir öğe oluşturduktan sonra genellikle bağlantının diğer tarafında okuyup ayıklarsınız. Aşağıdaki örnekte, öğe değişikliğini algılamak ve öğeyi ayıklamak için geri çağırma işlevinin nasıl uygulanacağı gösterilmektedir:

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
    }
}

Daha fazla bilgi için GitHub'daki DataLayer örnek projesine bakın.