Bu dokümanda, Wear OS cihaz ile elde etti.
Doğrudan ağdan veri gönderme ve senkronize etme
Doğrudan ağ ile iletişim kurmak için Wear OS uygulamaları oluşturma Aynısını kullan Mobil geliştirme için kullandığınız ancak Wear-OS'e özgü bazı API'ler göz önünde bulunduruyoruz.
Wear OS Data Katman API'yi kullanarak verileri senkronize etme
DataClient
, bileşenlerin bir DataItem
veya
Asset
.
Herhangi bir cihaza bağlı değilken veri öğelerini ve öğeleri ayarlamak mümkündür. Cihazlar bir ağ bağlantısı kurduğunda bu dosyalar senkronize edilir. Bu veriler uygulamanıza özeldir ve yalnızca diğer cihazlardaki uygulamanız tarafından erişilebilir.
DataItem
, Wear OS ağındaki tüm cihazlar genelinde senkronize edilir. Boyutları genellikle küçüktür.Resim gibi daha büyük bir nesneyi aktarmak için
Asset
kullanın. Sistem hangi öğelerin aktarıldığını izler ve otomatik olarak tekilleştirilir.
Hizmetlerdeki etkinlikleri dinleyin
WearableListenerService
sınıfını genişletin. Sistem,
temel WearableListenerService
ürününün yaşam döngüsü boyunca geçerlidir.
Bu durumda, veri öğeleri veya mesajlar göndermesi ve çalışma olmadığında hizmetin bağlantısını kaldırması gerekir.
gerekir.
Etkinliklerdeki etkinlikleri dinleyin
OnDataChangedListener
arayüzünü uygulayın. Bunun yerine bu arayüzü kullanın
yalnızcaWearableListenerService
kullandığının bir göstergesidir.
Verileri aktarma
Bluetooth aktarımı üzerinden ses kaydı gibi ikili büyük nesneleri göndermek için
başka bir cihazdan cihaza
Bir veri öğesine Asset
ekleyin ve ardından veri öğesini çoğaltılan veri deposuna yerleştirin.
Öğeler, yeniden iletimi önlemek için verilerin önbelleğe alınmasını otomatik olarak işler. koruyabilirsiniz. Avuç içi uygulamalarının resim indirip uygun boyuta küçültmesi yaygın bir kalıptır. ve giyilebilir cihazda öğe olarak aktarmak için kullanılabilir. Aşağıdaki örnekler nasıl oluşturulduğunu göstereceğim.
Not: Veri öğelerinin boyutu teorik olarak 100 KB ile sınırlı olsa da, pratikte daha büyük veri öğeleri kullanılabilir. Örneğin, daha büyük veri öğelerini, verileri benzersiz yollarla ayırın ve tüm veriler için tek bir yol kullanarak. Büyük öğelerin aktarılması, birçok farklı cihazda kullanıcı deneyimini etkiler. Bu nedenle, büyük öğeleri aktarırken iyi performans gösterdiklerinden emin olmak için uygulamalarınızı test edin.
Öğe aktarma
Şu öğedeki create...()
yöntemlerinden birini kullanarak öğeyi oluşturun:
Asset
sınıfı.
Bit eşlemi bayt akışına dönüştürüp şunu çağırın:
createFromBytes()
öğesini aşağıdaki örnekte gösterildiği gibi oluşturun.
Kotlin
private fun createAssetFromBitmap(bitmap: Bitmap): Asset = ByteArrayOutputStream().let { byteStream -> bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteStream) Asset.createFromBytes(byteStream.toByteArray()) }
Java
private static Asset createAssetFromBitmap(Bitmap bitmap) { final ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteStream); return Asset.createFromBytes(byteStream.toByteArray()); }
Daha sonra, öğeyi şurada putAsset()
yöntemini kullanarak bir veri öğesine ekleyin:
DataMap
veya
PutDataRequest
. Ardından,
putDataItem()
yöntemini çağırın.
Aşağıdaki örnekte PutDataRequest
kullanılmaktadır:
Kotlin
val asset: Asset = BitmapFactory.decodeResource(resources, R.drawable.image).let { bitmap -> createAssetFromBitmap(bitmap) } val request: PutDataRequest = PutDataRequest.create("/image").apply { putAsset("profileImage", asset) } val putTask: Task<DataItem> = Wearable.getDataClient(context).putDataItem(request)
Java
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image); Asset asset = createAssetFromBitmap(bitmap); PutDataRequest request = PutDataRequest.create("/image"); request.putAsset("profileImage", asset); Task<DataItem> putTask = Wearable.getDataClient(context).putDataItem(request);
Aşağıdaki örnekte PutDataMapRequest
kullanılmaktadır:
Kotlin
val asset: Asset = BitmapFactory.decodeResource(resources, R.drawable.image).let { bitmap -> createAssetFromBitmap(bitmap) } val request: PutDataRequest = PutDataMapRequest.create("/image").run { dataMap.putAsset("profileImage", asset) asPutDataRequest() } val putTask: Task<DataItem> = Wearable.getDataClient(context).putDataItem(request)
Java
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image); Asset asset = createAssetFromBitmap(bitmap); PutDataMapRequest dataMap = PutDataMapRequest.create("/image"); dataMap.getDataMap().putAsset("profileImage", asset); PutDataRequest request = dataMap.asPutDataRequest(); Task<DataItem> putTask = Wearable.getDataClient(context).putDataItem(request);
Öğeleri al
Bir öğe oluşturulduğunda muhtemelen bunu, bağlantının diğer tarafında yapar. Burada, geri çağırma işlevini kullanın:
Kotlin
override fun onDataChanged(dataEvents: DataEventBuffer) { dataEvents .filter { it.type == DataEvent.TYPE_CHANGED && it.dataItem.uri.path == "/image" } .forEach { event -> val bitmap: Bitmap? = DataMapItem.fromDataItem(event.dataItem) .dataMap.getAsset("profileImage") .let { asset -> loadBitmapFromAsset(asset) } // Do something with the bitmap } } fun loadBitmapFromAsset(asset: Asset): Bitmap? { // Convert asset into a file descriptor and block until it's ready val assetInputStream: InputStream? = Tasks.await(Wearable.getDataClient(context).getFdForAsset(asset)) ?.inputStream return assetInputStream?.let { inputStream -> // Decode the stream into a bitmap BitmapFactory.decodeStream(inputStream) } ?: run { Log.w(TAG, "Requested an unknown Asset.") null } }
Java
@Override public void onDataChanged(DataEventBuffer dataEvents) { for (DataEvent event : dataEvents) { if (event.getType() == DataEvent.TYPE_CHANGED && event.getDataItem().getUri().getPath().equals("/image")) { DataMapItem dataMapItem = DataMapItem.fromDataItem(event.getDataItem()); Asset profileAsset = dataMapItem.getDataMap().getAsset("profileImage"); Bitmap bitmap = loadBitmapFromAsset(profileAsset); // Do something with the bitmap } } } public Bitmap loadBitmapFromAsset(Asset asset) { if (asset == null) { throw new IllegalArgumentException("Asset must be non-null"); } // Convert asset into a file descriptor and block until it's ready InputStream assetInputStream = Tasks.await(Wearable.getDataClient(context).getFdForAsset(asset)) .getInputStream(); if (assetInputStream == null) { Log.w(TAG, "Requested an unknown Asset."); return null; } // Decode the stream into a bitmap return BitmapFactory.decodeStream(assetInputStream); }
Daha fazla bilgi için GitHub'da Datalayer örnek projesine bakın.