شما با استفاده از MessageClient
API پیام ارسال می کنید و موارد زیر را به پیام پیوست می کنید:
- یک بار دلخواه اختیاری
- مسیری که به طور منحصربهفرد اقدام پیام را مشخص میکند
برخلاف موارد داده، هیچ همگام سازی بین برنامه های دستی و پوشیدنی رخ نمی دهد. پیام ها یک مکانیسم ارتباطی یک طرفه هستند که برای تماس های رویه از راه دور (RPC) مفید هستند، مانند ارسال پیام به پوشیدنی برای شروع یک فعالیت.
چندین دستگاه پوشیدنی را می توان به دستگاه دستی کاربر متصل کرد. هر دستگاه متصل در شبکه یک گره در نظر گرفته می شود.
با چندین دستگاه متصل، باید در نظر بگیرید که کدام گره ها پیام ها را دریافت می کنند. به عنوان مثال، در یک برنامه رونویسی صدا که دادههای صوتی را روی دستگاه پوشیدنی دریافت میکند، پیام را به یک گره با قدرت پردازش و ظرفیت باتری برای رسیدگی به درخواست ارسال کنید، مانند یک دستگاه دستی.
توجه: هنگامی که جزئیات پیام خود را مشخص می کنید، امکان چندین گره متصل را در نظر بگیرید. مطمئن شوید که پیام به دستگاه ها یا گره های مورد نظر تحویل داده شده است.
برای مثال های استفاده به نمونه برنامه زیر مراجعه کنید: DataLayer
ارسال پیام
یک برنامه پوشیدنی می تواند عملکردهایی مانند رونویسی صدا را برای کاربران فراهم کند. کاربران می توانند با میکروفون دستگاه پوشیدنی خود صحبت کنند و رونوشت را در یادداشت ذخیره کنند. از آنجایی که یک دستگاه پوشیدنی معمولاً قدرت پردازش و ظرفیت باتری مورد نیاز برای انجام فعالیت رونویسی صدا را ندارد، برنامه باید این کار را در دستگاه متصل توانمندتری بارگذاری کند.
بخشهای زیر به شما نشان میدهند که چگونه گرههای دستگاهی را تبلیغ کنید که میتوانند درخواستهای فعالیت را پردازش کنند، گرههایی را که میتوانند نیاز درخواستی را برآورده کنند، و به آن گرهها پیام ارسال کنند.
قابلیت ها را تبلیغ کنید
برای راه اندازی یک فعالیت در یک دستگاه دستی از یک دستگاه پوشیدنی، از کلاس MessageClient
برای ارسال درخواست استفاده کنید. از آنجایی که چندین پوشیدنی را می توان به دستگاه دستی متصل کرد، برنامه پوشیدنی باید تعیین کند که یک گره متصل قادر به راه اندازی فعالیت است. در برنامه دستی خود، تبلیغ کنید که گره ای که روی آن اجرا می شود، قابلیت های خاصی را ارائه می دهد.
برای تبلیغ قابلیت های اپلیکیشن دستی خود، موارد زیر را انجام دهید:
- یک فایل پیکربندی XML در دایرکتوری
res/values/
پروژه خود ایجاد کنید و نام آن راwear.xml
بگذارید. - منبعی به نام
android_wear_capabilities
را بهwear.xml
اضافه کنید. - قابلیت هایی که دستگاه ارائه می دهد را تعریف کنید.
توجه: قابلیت ها رشته های سفارشی هستند که شما تعریف می کنید و باید در برنامه شما منحصر به فرد باشند.
مثال زیر نحوه اضافه کردن قابلیتی به نام voice_transcription
را به wear.xml
نشان میدهد:
<resources xmlns:tools="http://schemas.android.com/tools" tools:keep="@array/android_wear_capabilities"> <string-array name="android_wear_capabilities"> <item>voice_transcription</item> </string-array> </resources>
گره هایی با قابلیت های مورد نیاز را بازیابی کنید
در ابتدا می توانید با فراخوانی متد getCapability
از کلاس CapabilityClient
گره های توانمند را شناسایی کنید. برای استفاده از این روش، برنامه Wear OS و برنامه تلفن شما باید شناسه برنامه یکسانی داشته باشند. مثال زیر نحوه بازیابی دستی نتایج گره های قابل دسترسی با قابلیت voice_transcription
را نشان می دهد:
کاتلین
private const val VOICE_TRANSCRIPTION_CAPABILITY_NAME = "voice_transcription" ... private fun setupVoiceTranscription() { val capabilityInfo: CapabilityInfo = Tasks.await( Wearable.getCapabilityClient(context) .getCapability( VOICE_TRANSCRIPTION_CAPABILITY_NAME, CapabilityClient.FILTER_REACHABLE ) ) // capabilityInfo has the reachable nodes with the transcription capability updateTranscriptionCapability(capabilityInfo) }
جاوا
private static final String VOICE_TRANSCRIPTION_CAPABILITY_NAME = "voice_transcription"; ... private void setupVoiceTranscription() { CapabilityInfo capabilityInfo = Tasks.await( Wearable.getCapabilityClient(context).getCapability( VOICE_TRANSCRIPTION_CAPABILITY_NAME, CapabilityClient.FILTER_REACHABLE)); // capabilityInfo has the reachable nodes with the transcription capability updateTranscriptionCapability(capabilityInfo); }
برای شناسایی گرههای توانمند هنگام اتصال به دستگاه پوشیدنی، نمونهای از شنونده، بهویژه یک OnCapabilityChangedListener
از یک شی CapabilityClient
را ثبت کنید. مثال زیر نحوه ثبت شنونده و بازیابی نتیجه را با گره های قابل دسترسی که دارای قابلیت voice_transcription
هستند نشان می دهد:
کاتلین
private fun setupVoiceTranscription() { updateTranscriptionCapability(capabilityInfo).also { capabilityListener -> Wearable.getCapabilityClient(context).addListener( capabilityListener, VOICE_TRANSCRIPTION_CAPABILITY_NAME ) } }
جاوا
private void setupVoiceTranscription() { ... // This example uses a Java 8 Lambda. You can use named or anonymous classes. CapabilityClient.OnCapabilityChangedListener capabilityListener = capabilityInfo -> { updateTranscriptionCapability(capabilityInfo); }; Wearable.getCapabilityClient(context).addListener( capabilityListener, VOICE_TRANSCRIPTION_CAPABILITY_NAME); }
پس از شناسایی گره های توانمند، تعیین کنید که کجا پیام ارسال شود. گره ای را انتخاب کنید که در مجاورت دستگاه پوشیدنی شما باشد تا مسیریابی پیام از طریق چندین گره به حداقل برسد. گره نزدیک به عنوان گرهی تعریف می شود که مستقیماً به دستگاه متصل است. برای تعیین اینکه آیا یک گره در این نزدیکی است یا خیر، مانند اتصال از طریق بلوتوث، روش Node.isNearby()
را فراخوانی کنید. اگر بیش از یک گره در این نزدیکی است، یکی را خودسرانه انتخاب کنید. به طور مشابه، اگر هیچ گره توانمندی در این نزدیکی نیست، یک گره توانمند را خودسرانه انتخاب کنید.
مثال زیر نشان می دهد که چگونه می توانید بهترین گره را برای استفاده تعیین کنید:
کاتلین
private var transcriptionNodeId: String? = null private fun updateTranscriptionCapability(capabilityInfo: CapabilityInfo) { transcriptionNodeId = pickBestNodeId(capabilityInfo.nodes) } private fun pickBestNodeId(nodes: Set<Node>): String? { // Find a nearby node or pick one arbitrarily. return nodes.firstOrNull { it.isNearby }?.id ?: nodes.firstOrNull()?.id }
جاوا
private String transcriptionNodeId = null; private void updateTranscriptionCapability(CapabilityInfo capabilityInfo) { Set<Node> connectedNodes = capabilityInfo.getNodes(); transcriptionNodeId = pickBestNodeId(connectedNodes); } private String pickBestNodeId(Set<Node> nodes) { String bestNodeId = null; // Find a nearby node or pick one arbitrarily. for (Node node : nodes) { if (node.isNearby()) { return node.getId(); } bestNodeId = node.getId(); } return bestNodeId; }
پیام را برسانید
پس از شناسایی یک گره برای استفاده، پیام را با استفاده از کلاس MessageClient
ارسال کنید.
مثال زیر نحوه ارسال پیام به گره دارای قابلیت رونویسی از یک دستگاه پوشیدنی را نشان می دهد. این تماس همزمان است و پردازش را مسدود می کند تا زمانی که سیستم پیام را برای تحویل در صف قرار دهد.
توجه: کد نتیجه موفق، تحویل پیام را تضمین نمی کند. اگر برنامه شما به قابلیت اطمینان داده نیاز دارد، از اشیاء DataItem
یا کلاس ChannelClient
برای ارسال داده بین دستگاه ها استفاده کنید.
کاتلین
const val VOICE_TRANSCRIPTION_MESSAGE_PATH = "/voice_transcription" ... private fun requestTranscription(voiceData: ByteArray) { transcriptionNodeId?.also { nodeId -> val sendTask: Task<*> = Wearable.getMessageClient(context).sendMessage( nodeId, VOICE_TRANSCRIPTION_MESSAGE_PATH, voiceData ).apply { addOnSuccessListener { ... } addOnFailureListener { ... } } } }
جاوا
public static final String VOICE_TRANSCRIPTION_MESSAGE_PATH = "/voice_transcription"; private void requestTranscription(byte[] voiceData) { if (transcriptionNodeId != null) { Task<Integer> sendTask = Wearable.getMessageClient(context).sendMessage( transcriptionNodeId, VOICE_TRANSCRIPTION_MESSAGE_PATH, voiceData); // You can add success and/or failure listeners, // Or you can call Tasks.await() and catch ExecutionException sendTask.addOnSuccessListener(...); sendTask.addOnFailureListener(...); } else { // Unable to retrieve node with transcription capability } }
توجه: برای کسب اطلاعات بیشتر در مورد تماسهای ناهمزمان و همگام با سرویسهای Google Play و زمان استفاده از هر کدام، به Tasks API مراجعه کنید.
همچنین می توانید پیام ها را به تمام گره های متصل پخش کنید. برای بازیابی تمام گره های متصل که می توانید به آنها پیام ارسال کنید، کد زیر را پیاده سازی کنید:
کاتلین
private fun getNodes(): Collection<String> { return Tasks.await(Wearable.getNodeClient(context).connectedNodes).map { it.id } }
جاوا
private Collection<String> getNodes() { HashSet <String>results = new HashSet<String>(); List<Node> nodes = Tasks.await(Wearable.getNodeClient(context).getConnectedNodes()); for (Node node : nodes.getNodes()) { results.add(node.getId()); } return results; }
یک پیام دریافت کنید
برای اطلاع از پیام های دریافتی، رابط MessageClient.OnMessageReceivedListener
را پیاده سازی کنید تا شنونده ای برای رویدادهای پیام فراهم کنید. سپس شنونده را با متد addListener
ثبت کنید. مثال زیر نشان می دهد که چگونه می توانید شنونده را برای بررسی VOICE_TRANSCRIPTION_MESSAGE_PATH
پیاده سازی کنید. اگر این شرط true
است، فعالیتی را برای پردازش داده های صوتی شروع کنید.
کاتلین
fun onMessageReceived(messageEvent: MessageEvent) { if (messageEvent.path == VOICE_TRANSCRIPTION_MESSAGE_PATH) { val startIntent = Intent(this, MainActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) putExtra("VOICE_DATA", messageEvent.data) } startActivity(this, startIntent) } }
جاوا
@Override public void onMessageReceived(MessageEvent messageEvent) { if (messageEvent.getPath().equals(VOICE_TRANSCRIPTION_MESSAGE_PATH)) { Intent startIntent = new Intent(this, MainActivity.class); startIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startIntent.putExtra("VOICE_DATA", messageEvent.getData()); startActivity(this, startIntent); } }
این کد به جزئیات پیاده سازی بیشتری نیاز دارد. درباره نحوه اجرای یک سرویس یا فعالیت کامل شنونده در رویدادهای لایه داده گوش دادن بیاموزید.