Wear'da mesaj gönderip alın

İletilerinizi MessageClient API'yi tıklayın ve iletiye şu öğeleri ekleyin:

  • İsteğe bağlı rastgele yük
  • Mesajın işlemini benzersiz şekilde tanımlayan bir yol

Veri öğelerinden farklı olarak, uygulamalar da var. Mesajlar, uzak prosedür çağrıları (RPC) için faydalı olan tek yönlü bir iletişim mekanizmasıdır. örneğin bir aktivite başlatmak için giyilebilir cihaza mesaj göndermek gibi.

Kullanıcıların avuç içi cihazlarına birden fazla giyilebilir cihaz bağlanabilir. Şu kampanyadaki bağlı her cihaz: Ağ, bir düğüm olarak kabul edilir.

Birden fazla bağlı cihaz varsa hangisinin mesajları almasını sağlar. Örneğin, mesajı, işlemci gücü ve pili olan bir düğüme gönderin. kapasitesine sahip olmalıdır (ör. bir avuç içi cihaz).

Not: Mesajınızın ayrıntılarını belirtirken birden fazla soru sorma seçeneğini bağlı düğümler bulunur. Mesajın hedeflenen cihazlara veya düğümlere teslim edildiğinden emin olun.

Kullanım örnekleri için aşağıdaki örnek uygulamaya bakın: Veri Katmanı

Mesaj gönder

Giyilebilir uygulamalar, kullanıcılara ses gibi işlevler sağlayabilir. transkript. Kullanıcılar giyilebilir cihazlarının mikrofonuna konuşarak bir transkript elde edebilirler bir nota kaydedilir. Giyilebilir cihazların genellikle işlem gücü ve pili olmadığı için, uygulamanın bu işi başka bir cihaza yüklemesi gerekir. daha yetenekli bağlı bir cihaz olabilir.

Aşağıdaki bölümlerde, etkinliği işleyebilen cihaz düğümlerinin nasıl tanıtılacağı gösterilmektedir istenen bir ihtiyacı karşılayabilecek düğümleri keşfetme ve bunlara mesajları gönderme düğüm.

Giyilebilir bir cihazdan avuç içi bir cihazda etkinlik başlatmak için İsteği MessageClient sınıfa gönderebilir. Giyilebilir birden fazla cihaz, şunlara bağlanabilir: Giyilebilir uygulamasının, bağlı bir düğümün o anda etkin olmadığını etkinliği başlatabilirsiniz. Avuç içi uygulamanızda, ve belirli özellikler sunar.

Avuç içi uygulamanızın özelliklerini tanıtmak için aşağıdakileri yapın:

  1. Projenizin res/values/ dizininde bir XML yapılandırma dosyası oluşturun ve wear.xml olarak adlandıralım.
  2. wear.xml alanına android_wear_capabilities adlı bir kaynak ekleyin.
  3. Cihazın sağladığı özellikleri tanımlayın.

Not: Özellikler, sizin tanımladığınız özel dizelerdir ve uygulamanız içinde benzersiz olmalıdır.

Aşağıdaki örnekte, voice_transcription adlı bir özelliğin nasıl ekleneceği gösterilmektedir 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>

Gerekli özelliklere sahip düğümleri alma

Başlangıçta, uygun düğümleri getCapability yöntemi CapabilityClient sınıf. Bu yöntemi kullanmak için Wear OS uygulamanız ve telefon uygulamanız aynı uygulama kimliğine sahip olmalıdır. Aşağıdaki örnek voice_transcription özelliği:

Kotlin

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)
}

Java

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);
}

Uygun düğümleri giyilebilir cihaza bağlanırken tespit etmek için bir bir dinleyici örneği, özellikle de OnCapabilityChangedListener (CapabilityClient) bir nesnedir. Aşağıdaki örnekte, işleyiciyi kaydedebilir ve voice_transcription özelliği:

Kotlin

private fun setupVoiceTranscription() {
    updateTranscriptionCapability(capabilityInfo).also { capabilityListener ->
        Wearable.getCapabilityClient(context).addListener(
                capabilityListener,
                VOICE_TRANSCRIPTION_CAPABILITY_NAME
        )
    }
}

Java

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);
}

Uygun düğümleri tespit ettikten sonra iletinin nereye gönderileceğini belirleyin. Düğüm seçin giyilebilir cihazınızın yakınında olması gerekir. birden çok düğümden gelen ileti yönlendirmesini içerir. Yakındaki bir düğüm, doğrudan bağlı olan bir düğüm olarak tanımlanır ekleyebilirsiniz. Bir düğümün yakında olup olmadığını (ör. Bluetooth aracılığıyla bağlı) belirlemek için Node.isNearby() yöntemini çağırın. Yakınlarda birden fazla düğüm varsa rastgele bir düğüm seçin. Benzer şekilde, yakınlarda yetenekli düğüm yoksa rastgele bir yetenekli düğüm seçin.

Aşağıdaki örnekte, kullanılacak en iyi düğümü nasıl belirleyebileceğiniz gösterilmektedir:

Kotlin

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
}

Java

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;
}

Mesajı iletme

Kullanılacak bir düğüm belirledikten sonra MessageClient sınıfını kullanarak iletiyi gönderin.

Aşağıdaki örnekte, metne dönüştürme özellikli düğüme nasıl mesaj gönderileceği gösterilmektedir giyilebilir bir cihazdan düzenleyebilirsiniz. Bu çağrı eşzamanlıdır ve şu zamana kadar işlemeyi engeller: sistem iletiyi teslim edilmek üzere sıraya alır.

Not: Başarılı bir sonuç kodu, mesajı alırsınız. Uygulamanız veri güvenilirliği gerektiriyorsa DataItem kullanabilirsiniz nesneler veya ChannelClient sınıfını kullanır.

Kotlin

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 { ... }
        }
    }
}

Java

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
    }
}

Not: Eşzamansız ve eşzamanlı çağrılar hakkında daha fazla bilgi edinmek için: Google Play hizmetleri ve her birinin ne zaman kullanılacağı ile ilgili daha fazla bilgiyi Tasks API'de bulabilirsiniz.

Ayrıca, tüm bağlı düğümlere mesaj yayınlayabilirsiniz. Tüm mesaj gönderebileceğiniz bağlı düğümler için aşağıdaki kodu uygulayın:

Kotlin

private fun getNodes(): Collection<String> {
    return Tasks.await(Wearable.getNodeClient(context).connectedNodes).map { it.id }
}

Java

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;
}

Mesaj alma

Alınan mesajlarla ilgili bildirim almak için MessageClient.OnMessageReceivedListener. mesaj etkinlikleri için bir işleyici sağlar. Ardından dinleyiciyi kaydedin addListener ile yöntemidir. Aşağıdaki örnekte, test etmek istediğiniz işleyiciyi VOICE_TRANSCRIPTION_MESSAGE_PATH Bu koşul true, ses verilerini işlemek için bir etkinlik başlat.

Kotlin

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)
    }
}

Java

@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);
    }
}

Bu kod için uygulama hakkında daha fazla ayrıntı gerekir. Daha fazla bilgi bir tam dinleyici hizmetinin veya etkinliğinin Veri katmanı etkinliklerini izleyin.