এই ডকুমেন্টে বর্ণনা করা হয়েছে কীভাবে একটি Wear OS ডিভাইস এবং একটি হ্যান্ডহেল্ড ডিভাইসের মধ্যে ডেটা সিঙ্ক্রোনাইজ করতে হয়।
সরাসরি নেটওয়ার্ক থেকে ডেটা পাঠান এবং সিঙ্ক করুন
সরাসরি নেটওয়ার্কের সাথে যোগাযোগের জন্য Wear OS অ্যাপ তৈরি করুন। মোবাইল ডেভেলপমেন্টের জন্য ব্যবহৃত API-গুলোই ব্যবহার করুন, তবে Wear OS-এর কিছু নির্দিষ্ট পার্থক্যের কথা মাথায় রাখুন।
Wear OS ডেটা লেয়ার API ব্যবহার করে ডেটা সিঙ্ক্রোনাইজ করুন
একটি DataClient কম্পোনেন্টগুলির জন্য একটি DataItem বা Asset থেকে ডেটা পড়া বা লেখার জন্য একটি API প্রদান করে।
কোনো ডিভাইসের সাথে সংযুক্ত না থাকা অবস্থাতেও ডেটা আইটেম এবং অ্যাসেট সেট করা সম্ভব। ডিভাইসগুলো নেটওয়ার্ক সংযোগ স্থাপন করলে সেগুলো সিঙ্ক্রোনাইজ হয়ে যায়। এই ডেটা আপনার অ্যাপের জন্য ব্যক্তিগত এবং অন্য ডিভাইসে শুধুমাত্র আপনার অ্যাপই এটি অ্যাক্সেস করতে পারে।
একটি Wear OS নেটওয়ার্কের সমস্ত ডিভাইসে একটি
DataItemসিঙ্ক্রোনাইজ করা হয়। এগুলি সাধারণত আকারে ছোট হয়।একটি ছবির মতো বড় কোনো অবজেক্ট স্থানান্তর করতে একটি
Assetব্যবহার করুন। সিস্টেমটি কোন অ্যাসেটগুলো ইতিমধ্যে স্থানান্তর করা হয়েছে তার হিসাব রাখে এবং স্বয়ংক্রিয়ভাবে ডুপ্লিকেটগুলো অপসারণ করে।
পরিষেবাগুলিতে অনুষ্ঠানগুলির জন্য শুনুন
WearableListenerService ক্লাসটি এক্সটেন্ড করুন। সিস্টেমটি বেস WearableListenerService এর লাইফসাইকেল পরিচালনা করে; ডেটা আইটেম বা মেসেজ পাঠানোর প্রয়োজন হলে সার্ভিসটির সাথে বাইন্ড হয় এবং যখন কোনো কাজের প্রয়োজন হয় না, তখন সার্ভিসটিকে আনবাইন্ড করে।
কার্যকলাপের ঘটনাগুলির জন্য শুনুন
OnDataChangedListener ইন্টারফেসটি ইমপ্লিমেন্ট করুন। যখন আপনি শুধুমাত্র ব্যবহারকারী সক্রিয়ভাবে আপনার অ্যাপ ব্যবহার করার সময় পরিবর্তনগুলি শুনতে চান, তখন WearableListenerService এর পরিবর্তে এই ইন্টারফেসটি ব্যবহার করুন।
ডেটা স্থানান্তর করুন
ব্লুটুথ ট্রান্সপোর্টের মাধ্যমে বাইনারি লার্জ অবজেক্ট, যেমন অন্য ডিভাইস থেকে ভয়েস রেকর্ডিং, পাঠানোর জন্য আপনি একটি ডেটা আইটেমের সাথে একটি Asset সংযুক্ত করতে পারেন এবং তারপর ডেটা আইটেমটিকে রেপ্লিকেটেড ডেটাস্টোরে রাখতে পারেন।
অ্যাসেটগুলো স্বয়ংক্রিয়ভাবে ডেটার ক্যাশিং পরিচালনা করে, যা ডেটার পুনঃপ্রেরণ রোধ করে এবং ব্লুটুথ ব্যান্ডউইথ সাশ্রয় করে। একটি সাধারণ রীতি হলো, হ্যান্ডহেল্ড অ্যাপ একটি ছবি ডাউনলোড করে, পরিধানযোগ্য ডিভাইসে প্রদর্শনের জন্য সেটিকে উপযুক্ত আকারে ছোট করে এবং একটি অ্যাসেট হিসেবে পরিধানযোগ্য ডিভাইসের অ্যাপে প্রেরণ করে। নিম্নলিখিত উদাহরণগুলো এই রীতিটি প্রদর্শন করে।
দ্রষ্টব্য: যদিও ডেটা আইটেমের আকার তাত্ত্বিকভাবে ১০০ কিলোবাইটে সীমাবদ্ধ, বাস্তবে এর চেয়ে বড় ডেটা আইটেমও ব্যবহার করা যেতে পারে। বড় ডেটা আইটেমের ক্ষেত্রে, ডেটাগুলোকে স্বতন্ত্র পাথ দিয়ে আলাদা করুন এবং সমস্ত ডেটার জন্য একটিমাত্র পাথ ব্যবহার করা থেকে বিরত থাকুন। অনেক ক্ষেত্রে বড় অ্যাসেট স্থানান্তর করা ব্যবহারকারীর অভিজ্ঞতার উপর প্রভাব ফেলে, তাই আপনার অ্যাপগুলো পরীক্ষা করে নিশ্চিত করুন যে বড় অ্যাসেট স্থানান্তরের সময় সেগুলো ভালোভাবে কাজ করে।
একটি সম্পদ হস্তান্তর করুন
Asset ক্লাসের create...() মেথডগুলোর যেকোনো একটি ব্যবহার করে অ্যাসেটটি তৈরি করুন। একটি বিটম্যাপকে বাইট স্ট্রিমে রূপান্তর করুন এবং তারপর অ্যাসেটটি তৈরি করতে createFromBytes() কল করুন, যেমনটি নিম্নলিখিত নমুনায় দেখানো হয়েছে।
কোটলিন
private fun createAssetFromBitmap(bitmap: Bitmap): Asset = ByteArrayOutputStream().let { byteStream -> bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteStream) Asset.createFromBytes(byteStream.toByteArray()) }
জাভা
private static Asset createAssetFromBitmap(Bitmap bitmap) { final ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteStream); return Asset.createFromBytes(byteStream.toByteArray()); }
এরপরে, DataMap বা PutDataRequest এর putAsset() মেথড ব্যবহার করে অ্যাসেটটিকে একটি ডেটা আইটেমের সাথে সংযুক্ত করুন। তারপর, নিচের নমুনাগুলোতে দেখানো অনুযায়ী putDataItem() মেথড ব্যবহার করে ডেটা আইটেমটি ডেটাস্টোরে রাখুন।
নিম্নলিখিত নমুনাটি PutDataRequest ব্যবহার করে:
কোটলিন
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)
জাভা
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);
নিম্নলিখিত নমুনাটি PutDataMapRequest ব্যবহার করে:
কোটলিন
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)
জাভা
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);
সম্পদ গ্রহণ করুন
যখন কোনো অ্যাসেট তৈরি করা হয়, তখন আপনি সম্ভবত কানেকশনের অপর প্রান্ত থেকে সেটি পড়তে এবং এক্সট্র্যাক্ট করতে চাইবেন। অ্যাসেটের পরিবর্তন শনাক্ত করতে এবং অ্যাসেটটি এক্সট্র্যাক্ট করার জন্য কলব্যাক কীভাবে ইমপ্লিমেন্ট করতে হয়, তার একটি উদাহরণ নিচে দেওয়া হলো:
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 নমুনা প্রকল্পটি দেখুন।