ওয়াচফেস পুশ আপনার অ্যাপকে Wear OS ডিভাইসে ওয়াচফেস ম্যানেজ করতে দেয়। এর মধ্যে ওয়াচফেস যোগ করা, আপডেট করা ও সরিয়ে দেওয়া এবং অ্যাক্টিভ ওয়াচফেস সেট করা অন্তর্ভুক্ত। Watch Face Push API ব্যবহার করতে আপনার Wear OS অ্যাপ কনফিগার করুন।
সেট-আপ করুন
আপনার build.gradle.kts ফাইলে androidx.wear.watchfacepush:watchfacepush ডিপেন্ডেন্সি যোগ করুন।
আপনার AndroidManifest.xml-এ নিম্নলিখিত ব্যক্তিদের যোগ করুন:
<!-- Required to use the Watch Face Push API. --> <uses-permission android:name="com.google.wear.permission.PUSH_WATCH_FACES" />
ম্যানেজার ইনস্ট্যান্সের রেফারেন্স পাওয়া
WatchFacePushManager-এর একটি ইনস্ট্যান্স পান:
val watchFacePushManager = WatchFacePushManagerFactory.createWatchFacePushManager(context)
WatchFacePushManager, Watch Face Push-এর সাথে ইন্টার্যাক্ট করার
সব পদ্ধতির অ্যাক্সেস প্রদান করে।
স্লট নিয়ে কাজ করা
Watch Face Push-এর সাথে কাজ করার সময় একটি গুরুত্বপূর্ণ ধারণা হল স্লট। স্লট হল আপনার অ্যাপ্লিকেশনের ইনস্টল করা ওয়াচফেসকে অ্যাড্রেস করার একটি উপায়। সিস্টেম মার্কেটপ্লেসের জন্য সর্বাধিক স্লটের সংখ্যা সেট করে; Wear OS 6-এ, এই সীমা ১।
ওয়াচ ফেসে আপডেট বা সেটি সরিয়ে দেওয়ার সময়, slotId ব্যবহার করে সেই ওয়াচ ফেসটি শনাক্ত করা হয়
যেটির উপর অপারেশন পারফর্ম করতে হবে।
ওয়াচফেসের তালিকা
ইনস্টল করা ওয়াচফেসের তালিকা পেতে, listWatchFaces() ব্যবহার করুন:
val response = watchFacePushManager.listWatchFaces() val installedList = response.installedWatchFaceDetails installedList.forEach { Log.i(TAG, "Installed watchface: ${it.packageName}") } val remainingSlots = response.remainingSlotCount Log.i(TAG, "Remaining slots: $remainingSlots")
এর মাধ্যমে আপনি নির্ধারণ করতে পারবেন যে স্লটটি উপলভ্য আছে কিনা অথবা আগে থেকে থাকা ওয়াচফেসটি সরিয়ে দিয়ে অন্য একটি ওয়াচফেস যোগ করতে হবে কিনা। এছাড়াও, তালিকাটি ইনস্টল করা ওয়াচফেস সম্পর্কে বিবরণ দেয়। যেমন, কোনও প্রদত্ত ওয়াচফেস প্যাকেজ ইনস্টল করা আছে কিনা তা চেক করতে:
suspend fun isInstalled(packageName: String) = watchFacePushManager.listWatchFaces() .installedWatchFaceDetails.any { it.packageName == packageName }
ওয়াচফেস যোগ করা
listWatchFaces
উত্তরের মাধ্যমে যদি জানা যায় যে স্লট উপলভ্য আছে, তাহলে addWatchFace() পদ্ধতি ব্যবহার করতে হবে:
try { // Supply the validation token along with the watch face package data itself. val slot = watchFacePushManager.addWatchFace(parcelFileDescriptor, token) Log.i(TAG, "${slot.packageName} (${slot.versionCode}) added in slot ${slot.slotId}") } catch (e: WatchFacePushManager.AddWatchFaceException) { Log.e(TAG, "Something went wrong installing the watch face", e) }
ওয়াচফেস আপডেট করা
ওয়াচফেস আপডেট করলে, আপনি কোনও নির্দিষ্ট স্লটের কন্টেন্ট একটি নতুন প্যাকেজ দিয়ে পরিবর্তন করতে পারবেন। এর মধ্যে একই ওয়াচফেসের নতুন ভার্সনে আপগ্রেড করা অথবা সম্পূর্ণ অন্য একটি ওয়াচফেস দিয়ে সেটি পাল্টে দেওয়া অন্তর্ভুক্ত।
// Replacing the com.example.watchfacepush.green watch face with // com.example.watchfacepush.red val slotId = watchFacePushManager.listWatchFaces().installedWatchFaceDetails .firstOrNull { it.packageName == "com.example.watchfacepush.green" }?.slotId ?: throw IllegalArgumentException("No green watch face found") try { watchFacePushManager.updateWatchFace(slotId, redParcelFileDesc, redValidationToken) } catch (e: WatchFacePushManager.UpdateWatchFaceException) { Log.e(TAG, "Something went wrong updating the watch face", e) }
ওয়াচফেস সরানো
ওয়াচফেস সরাতে:
// Remove the com.example.watchfacepush.green watch face. val slotId = watchFacePushManager.listWatchFaces().installedWatchFaceDetails .firstOrNull { it.packageName == "com.example.watchfacepush.green" }?.slotId ?: throw IllegalArgumentException("No green watch face found") try { watchFacePushManager.removeWatchFace(slotId) } catch (e: WatchFacePushManager.RemoveWatchFaceException) { Log.e(TAG, "Something went wrong removing the watch face", e) }
এই পদ্ধতির অর্থ হল, আপনার ওয়াচফেস সবসময় সিস্টেম ওয়াচ ফেস পিকারে পাওয়া যাবে। আপনি নিজের লোগোটি স্পষ্টভাবে ফিচার করতে পারেন এবং এমনকি ফোনে আপনার Marketplace অ্যাপ লঞ্চ করার জন্য একটি বোতামও ফিচার করতে পারেন।
আপনার ওয়াচফেস অ্যাক্টিভ আছে কিনা তা চেক করুন
ব্যবহারকারীকে মসৃণ অভিজ্ঞতা প্রদান করার জন্য আপনার মার্কেটপ্লেসে অ্যাক্টিভ ওয়াচফেস সেট করা আছে কিনা তা নির্ধারণ করা গুরুত্বপূর্ণ: মার্কেটপ্লেসে আগে থেকেই অ্যাক্টিভ ওয়াচফেস সেট করা থাকলে, ব্যবহারকারী অন্য কোনও ওয়াচফেস বেছে নিতে চাইলে, সেটি কার্যকর করার জন্য তাকে মার্কেটপ্লেস অ্যাপের মাধ্যমে বর্তমান ওয়াচফেসটি পরিবর্তন করতে হবে। তবে, মার্কেটপ্লেসে অ্যাক্টিভ ওয়াচ ফেস সেট করা না থাকলে, ফোন অ্যাপকে অবশ্যই ব্যবহারকারীকে আরও নির্দেশিকা দিতে হবে। এই ব্যবহারকারীর অভিজ্ঞতা কীভাবে ম্যানেজ করবেন সেই সম্পর্কে আরও জানতে ফোন অ্যাপের বিভাগটি দেখুন।
মার্কেটপ্লেসে অ্যাক্টিভ ওয়াচফেস সেট করা আছে কিনা তা নির্ধারণ করতে, নিম্নলিখিত লজিক ব্যবহার করুন:
suspend fun hasActiveWatchFace() = watchFacePushManager.listWatchFaces() .installedWatchFaceDetails .any { watchFacePushManager.isWatchFaceActive(it.packageName) }
একটি ডিফল্ট ওয়াচফেস প্রদান করা
আপনার মার্কেটপ্লেস অ্যাপ ইনস্টল করা হলে, ওয়াচফেস পুশ ডিফল্ট ওয়াচফেস ইনস্টল করার সুবিধা দেয়। এটি নিজে থেকে সেই ডিফল্ট ওয়াচ ফেসকে অ্যাক্টিভ হিসেবে সেট করে না (অ্যাক্টিভ ওয়াচফেস সেট করা দেখুন), তবে আপনার ওয়াচফেসকে সিস্টেম ওয়াচফেস পিকারে উপলভ্য করে তোলে।
এই ফিচার ব্যবহার করতে:
- আপনার Wear OS অ্যাপ বিল্ডে, পাথে ডিফল্ট ওয়াচফেস অন্তর্ভুক্ত করুন:
assets/default_watchface.apk আপনার
AndroidManifest.xml-এ নিম্নলিখিত এন্ট্রি যোগ করুন<meta-data android:name="com.google.android.wearable.marketplace.DEFAULT_WATCHFACE_VALIDATION_TOKEN" android:value="@string/default_wf_token" />
অ্যাক্টিভ ওয়াচফেস সেট করা
মার্কেটপ্লেস অ্যাপের অ্যাক্টিভ ওয়াচফেস সেট করার পদ্ধতি ওয়াচফেস পুশ প্রদান করে।
এর অর্থ হল, বর্তমান অ্যাক্টিভ ওয়াচফেস মার্কেটপ্লেসের না হলে, অ্যাপটি মার্কেটপ্লেসের
ওয়াচফেসকে অ্যাক্টিভ ওয়াচফেস হিসেবে সেট করতে পারবে।
মনে রাখবেন, মার্কেটপ্লেসে
আগে থেকেই অ্যাক্টিভ ওয়াচফেস থাকলে, এটি পরিবর্তন করে অন্য ওয়াচফেস করার জন্য
updateWatchFace-এ কল করে ওয়াচফেস স্লটের কন্টেন্ট
অন্য ওয়াচফেস দিয়ে পাল্টানো হয়।
অ্যাক্টিভ ওয়াচফেস সেট করা হল দুটি ধাপের প্রসেস:
- অ্যাক্টিভ ওয়াচফেস সেট করার জন্য প্রয়োজনীয় Android অনুমতি সংগ্রহ করুন।
setWatchFaceAsActiveমেথড কল করুন।
অ্যাক্টিভ ওয়াচফেস সেট করার জন্য অনুমতি নেওয়া
প্রয়োজনীয় অনুমতি হল SET_PUSHED_WATCH_FACE_AS_ACTIVE, যা আপনার ম্যানিফেস্টে যোগ করতে হবে:
<!-- Required to be able to call the setWatchFaceAsActive() method. --> <uses-permission android:name="com.google.wear.permission.SET_PUSHED_WATCH_FACE_AS_ACTIVE" />
যেহেতু এটি রানটাইম অনুমতি, তাই অ্যাপ রান করার সময় আপনার অ্যাপকে অবশ্যই ব্যবহারকারীর কাছ থেকে এই অনুমতি চাইতে হবে (এই ব্যাপারে সাহায্য পেতে সঙ্গী লাইব্রেরি বিবেচনা করুন)।
ওয়াচফেসটি অ্যাক্টিভ হিসেবে সেট করুন
অনুমতি দেওয়া হয়ে গেলে, অ্যাক্টিভ থাকা ওয়াচফেসের স্লট ID
-তে setWatchFaceAsActive-এ কল করুন।
এই পদ্ধতি ব্যবহার করা হয়ে গেলে, আপনার ফোন অ্যাপ-এর পরিবর্তে অ্যাক্টিভ ওয়াচফেস কীভাবে ম্যানুয়ালি সেট করতে হয় সেই বিষয়ে নির্দেশিকা দেওয়া উচিত।
আপনার ওয়াচফেস APK থেকে অতিরিক্ত মেটাডেটা পড়া
WatchFaceSlot অবজেক্টটি আপনার ওয়াচফেসে ঘোষণা করতে পারেন এমন অতিরিক্ত
তথ্য পাওয়ার উপায়ও প্রদান করে।
এটি বিশেষ করে সেইসব ক্ষেত্রে কাজে লাগতে পারে যেখানে একই ওয়াচফেসের মাইনর ভেরিয়েন্ট আছে। যেমন, আপনার কাছে এই ধরনের ওয়াচ ফেস থাকতে পারে:
- প্যাকেজের নাম:
com.myapp.watchfacepush.mywatchface - প্যাকেজ ভার্সন:
1.0.0
কিন্তু এই ওয়াচ ফেস চারটি আলাদা আলাদা APK হিসেবে আসতে পারে, যেখানে সবগুলিই প্রায়
একই, কিন্তু আলাদা আলাদা ডিফল্ট রঙ: লাল, হলুদ, সবুজ এবং
নীল, যা ওয়াচ ফেস ফর্ম্যাট XML-এর ColorConfiguration-এ সেট করা আছে।
এই সামান্য পরিবর্তনটি চারটি APK-র প্রত্যেকটিতে প্রতিফলিত হয়:
<!-- For watch face com.myapp.watchfacepush.mywatchface --> <property android:name="default_color" android:value="red" />
কাস্টম প্রপার্টি ব্যবহার করলে, আপনার অ্যাপ নির্ধারণ করতে পারবে যে এইসব ভেরিয়েন্টের মধ্যে কোনটি ইনস্টল করা আছে:
val color = watchFaceDetails .getMetaData("com.myapp.watchfacepush.mywatchface.default_color") .invoke() Log.i(TAG, "Default color: $color")
বিবেচ্য বিষয়
আপনার অ্যাপে ওয়াচফেস পুশ প্রয়োগ করার সময় যেসব গুরুত্বপূর্ণ বিষয় বিবেচনা করতে হবে সেগুলির মধ্যে রয়েছে পাওয়ার খরচ, ক্যাশিং, বান্ডেল করা ওয়াচফেস আপডেট করা এবং একটি প্রতিনিধিত্বমূলক ডিফল্ট ওয়াচফেস প্রদান করা।
বিদ্যুৎ
Wear OS-এ চলে এমন যেকোনও অ্যাপের ক্ষেত্রে বিদ্যুতের ব্যবহার একটি গুরুত্বপূর্ণ বিষয়। আপনার মার্কেটপ্লেস অ্যাপের Wear OS কম্পোনেন্টের জন্য:
- আপনার অ্যাপ যত কম এবং যত বিরতি দিয়ে চালানো যায়, তত ভাল (যদি না ব্যবহারকারী
সরাসরি ইন্টার্যাক্ট করেন)। এর মধ্যে এগুলি অন্তর্ভুক্ত:
- ফোন অ্যাপ থেকে অ্যাপকে জাগিয়ে তোলার প্রসেস ছোট করা
- WorkManager জব চালানো কমানো
- ওয়াচ চার্জ দেওয়ার সময় অ্যানালিটিক্স রিপোর্টিং শিডিউল করা:
- আপনি Wear OS অ্যাপ বা অন্য কোনও
মেট্রিক্স থেকে ব্যবহারের পরিসংখ্যান সম্পর্কে অভিযোগ জানাতে চাইলে,
requiresChargingকনস্ট্রেন্ট সহ WorkManager ব্যবহার করুন।
- আপনি Wear OS অ্যাপ বা অন্য কোনও
মেট্রিক্স থেকে ব্যবহারের পরিসংখ্যান সম্পর্কে অভিযোগ জানাতে চাইলে,
- ওয়াচ চার্জে থাকাকালীন আপডেট শিডিউল করুন এবং ওয়াই-ফাই ব্যবহার করুন:
- ইনস্টল করা ওয়াচফেসের ভার্সন চেক করে দেখতে পারেন এবং
সেগুলি অটোমেটিক আপডেট করতে পারেন। আবার,
requiresNetworkType-এর জন্যrequiresChargingconstraint এবংUNMETEREDনেটওয়ার্কের ধরন ব্যবহার করুন। - চার্জে থাকাকালীন, ডিভাইসের ওয়াই-ফাই অ্যাক্সেস থাকার সম্ভাবনা থাকে। আপডেট করা APK দ্রুত ডাউনলোড করতে ওয়াই-ফাইয়ের জন্য অনুরোধ করুনএবং হয়ে গেলে নেটওয়ার্ক রিলিজ করুন ।
- মার্কেটপ্লেস যেখানে দিনের ওয়াচ ফেস অফার করতে পারে, সেখানেও একই নির্দেশিকা প্রযোজ্য; ওয়াচ চার্জ করার সময় এটি আগে থেকে ডাউনলোড করে নিন।
- ইনস্টল করা ওয়াচফেসের ভার্সন চেক করে দেখতে পারেন এবং
সেগুলি অটোমেটিক আপডেট করতে পারেন। আবার,
- অ্যাক্টিভ ওয়াচফেস চেক করার জন্য কোনও জব শিডিউল করবেন না:
- আপনার মার্কেটপ্লেসে এখনও অ্যাক্টিভ ওয়াচফেস আছে কিনা এবং সেটি কোন ওয়াচফেস তা মাঝে মাঝে চেক করলে ব্যাটারি খরচ হয়। এই পদ্ধতি এড়িয়ে চলুন।
- ওয়াচে বিজ্ঞপ্তি ব্যবহার করবেন না:
- আপনার অ্যাপ বিজ্ঞপ্তি ব্যবহার করলে, সেগুলিকে ফোনে ফোকাস করুন, যেখানে ব্যবহারকারীর
অ্যাকশন, জার্নি চালিয়ে যাওয়ার জন্য ফোন অ্যাপ খোলে।
setLocalOnlyব্যবহার করে ওয়াচ অ্যাপে ব্রিজ না করার জন্য বিজ্ঞপ্তি কনফিগার করুন।
- আপনার অ্যাপ বিজ্ঞপ্তি ব্যবহার করলে, সেগুলিকে ফোনে ফোকাস করুন, যেখানে ব্যবহারকারীর
অ্যাকশন, জার্নি চালিয়ে যাওয়ার জন্য ফোন অ্যাপ খোলে।
ক্যাশে করা হচ্ছে
প্রামাণিক মার্কেটপ্লেসের উদাহরণে, ওয়াচফেস ফোন থেকে ওয়াচে ট্রান্সফার করা হয়। এই কানেকশনটি সাধারণত ব্লুটুথ কানেকশন হয়, যা খুব ধীরে কাজ করতে পারে।
আরও ভালো ব্যবহারকারীর অভিজ্ঞতা প্রদান করতে এবং রিট্রান্সমিশন পাওয়ার সাশ্রয় করতে, Wear OS ডিভাইসে ছোট ক্যাশে প্রয়োগ করার কথা বিবেচনা করুন যাতে কয়েকটি APK সেভ করা যায়।
ব্যবহারকারী অন্য কোনও ওয়াচ ফেস ব্যবহার করার চেষ্টা করার পরে যদি আগের ওয়াচ ফেসে ফিরে যাওয়ার সিদ্ধান্ত নেন, তাহলে এই অ্যাকশনটি প্রায় সঙ্গে সঙ্গেই হয়ে যায়।
একইভাবে, এটি দিনের ওয়াচ ফেস বা এই ধরনের স্কিমের জন্য প্রি-ক্যাশিংয়ের ক্ষেত্রে ব্যবহার করা যেতে পারে, যেখানে Wear OS ডিভাইস চার্জ করার সময় ওয়াচ ফেস ডাউনলোড করা হয়।
বান্ডেল করা ওয়াচফেস আপডেট করা
আপনার অ্যাপে আগে বর্ণনা করা ডিফল্ট ওয়াচফেস অ্যাসেট থাকতে পারে। এটি মনে রাখা গুরুত্বপূর্ণ যে, আপনার মার্কেটপ্লেস অ্যাপ ইনস্টল করা হলে, এই ওয়াচ ফেসটি সিস্টেমে ইনস্টল করা হয়। তবে, আপনার মার্কেটপ্লেস অ্যাপের কোনও আপডেটের সাথে যদি নতুন কোনও ভার্সন বান্ডেল করা থাকে, তাহলে ওয়াচ ফেস আপডেট করা হয় না।
এই পরিস্থিতি সামাল দিতে, আপনার মার্কেটপ্লেস অ্যাপকে
MY_PACKAGE_REPLACED ব্রডকাস্ট অ্যাকশন শুনতে হবে এবং প্যাকেজ অ্যাসেট থেকে কোনও বান্ডেল করা ওয়াচফেস আপডেট করার
প্রয়োজন আছে কিনা তা চেক করতে হবে।
প্রতিনিধিত্বমূলক ডিফল্ট ওয়াচফেস
ডিফল্ট ওয়াচফেস আপনার ব্যবহারকারীদের মার্কেটপ্লেস খুঁজে পেতে ও ব্যবহার করতে সাহায্য করার একটি দারুণ উপায়: আপনার মার্কেটপ্লেস ইনস্টল করা হলে ওয়াচফেস ইনস্টল করা হয়, তাই ব্যবহারকারীরা ওয়াচফেস গ্যালারিতে এটি খুঁজে পেতে পারেন।
ডিফল্ট ওয়াচফেসের সাথে কাজ করার সময় কিছু বিষয় বিবেচনা করতে হবে:
- ব্যবহারকারী আপনার মার্কেটপ্লেস অ্যাপ থেকে কোনও ওয়াচফেস আনইনস্টল করার বিকল্প বেছে নিলে,
removeWatchFaceব্যবহার করবেন না। পরিবর্তে, এই ক্ষেত্রে,updateWatchFaceব্যবহার করে ওয়াচফেসটিকে ডিফল্ট ওয়াচফেসে ফিরিয়ে আনুন। এটি ব্যবহারকারীদের আপনার ওয়াচফেস খুঁজে পেতে এবং গ্যালারি থেকে এটি সেট করতে সাহায্য করে। - ডিফল্ট ওয়াচফেসটি আপনার লোগো ও থিমের মাধ্যমে সহজ ও সাথে সাথে চিনে নেওয়ার মতো করে তুলুন। এটি ব্যবহারকারীদের ওয়াচ ফেস গ্যালারিতে এটি খুঁজে পেতে সাহায্য করে।
ফোন অ্যাপ খোলার জন্য ডিফল্ট ওয়াচ ফেসে একটি বোতাম যোগ করুন। এটি দুটি ধাপে করা যেতে পারে:
Wear OS অ্যাপ ব্যবহার করে ইনটেন্ট লঞ্চ করতে, ওয়াচফেসে একটি
Launchএলিমেন্ট যোগ করুন যেমন:<Launch target="com.myapp/com.myapp.LaunchOnPhoneActivity" />LaunchOnPhoneActivity-এ,RemoteActivityHelperব্যবহার করে ফোন অ্যাপ লঞ্চ করুন।