در Wear پیام ارسال و دریافت کنید

شما با استفاده از MessageClient API پیام ارسال می کنید و موارد زیر را به پیام پیوست می کنید:

  • یک بار دلخواه اختیاری
  • مسیری که به طور منحصربه‌فرد اقدام پیام را مشخص می‌کند

برخلاف موارد داده، هیچ همگام سازی بین برنامه های دستی و پوشیدنی رخ نمی دهد. پیام ها یک مکانیسم ارتباطی یک طرفه هستند که برای تماس های رویه از راه دور (RPC) مفید هستند، مانند ارسال پیام به پوشیدنی برای شروع یک فعالیت.

چندین دستگاه پوشیدنی را می توان به دستگاه دستی کاربر متصل کرد. هر دستگاه متصل در شبکه یک گره در نظر گرفته می شود.

با چندین دستگاه متصل، باید در نظر بگیرید که کدام گره ها پیام ها را دریافت می کنند. به عنوان مثال، در یک برنامه رونویسی صدا که داده‌های صوتی را روی دستگاه پوشیدنی دریافت می‌کند، پیام را به یک گره با قدرت پردازش و ظرفیت باتری برای رسیدگی به درخواست ارسال کنید، مانند یک دستگاه دستی.

توجه: هنگامی که جزئیات پیام خود را مشخص می کنید، امکان چندین گره متصل را در نظر بگیرید. مطمئن شوید که پیام به دستگاه ها یا گره های مورد نظر تحویل داده شده است.

برای مثال های استفاده به نمونه برنامه زیر مراجعه کنید: DataLayer

ارسال یک پیام

یک برنامه پوشیدنی می تواند عملکردهایی مانند رونویسی صدا را برای کاربران فراهم کند. کاربران می توانند با میکروفون دستگاه پوشیدنی خود صحبت کنند و رونوشت را در یادداشت ذخیره کنند. از آنجایی که یک دستگاه پوشیدنی معمولاً قدرت پردازش و ظرفیت باتری مورد نیاز برای انجام فعالیت رونویسی صدا را ندارد، برنامه باید این کار را در دستگاه متصل توانمندتری بارگذاری کند.

بخش‌های زیر به شما نشان می‌دهند که چگونه گره‌های دستگاهی را تبلیغ کنید که می‌توانند درخواست‌های فعالیت را پردازش کنند، گره‌هایی را که می‌توانند نیاز درخواستی را برآورده کنند، و به آن گره‌ها پیام ارسال کنند.

برای راه اندازی یک فعالیت در یک دستگاه دستی از یک دستگاه پوشیدنی، از کلاس MessageClient برای ارسال درخواست استفاده کنید. از آنجایی که چندین پوشیدنی را می توان به دستگاه دستی متصل کرد، برنامه پوشیدنی باید تعیین کند که یک گره متصل قادر به راه اندازی فعالیت است. در برنامه دستی خود، تبلیغ کنید که گره ای که روی آن اجرا می شود، قابلیت های خاصی را ارائه می دهد.

برای تبلیغ قابلیت های اپلیکیشن دستی خود، موارد زیر را انجام دهید:

  1. یک فایل پیکربندی XML در دایرکتوری res/values/ پروژه خود ایجاد کنید و نام آن را wear.xml بگذارید.
  2. منبعی به نام android_wear_capabilities را به wear.xml اضافه کنید.
  3. قابلیت هایی که دستگاه ارائه می دهد را تعریف کنید.

توجه: قابلیت ها رشته های سفارشی هستند که شما تعریف می کنید و باید در برنامه شما منحصر به فرد باشند.

مثال زیر نحوه اضافه کردن قابلیتی به نام 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);
    }
}

این کد به جزئیات پیاده سازی بیشتری نیاز دارد. درباره نحوه اجرای یک سرویس یا فعالیت کامل شنونده در رویدادهای لایه داده گوش دادن بیاموزید.