Wear'da mesaj gönderip alın

MessageClient API'yi kullanarak mesaj gönderir ve mesaja aşağıdaki öğeleri eklersiniz:

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

Veri öğelerinden farklı olarak, taşınabilir uygulamalar ve giyilebilir uygulamalar arasında herhangi bir senkronizasyon yapılmaz. Mesajlar, bir etkinlik başlatmak için giyilebilir cihaza mesaj göndermek gibi uzak prosedür çağrıları (RPC) için yararlı olan tek yönlü bir iletişim mekanizmasıdır.

Bir kullanıcının avuç içi cihazına birden fazla giyilebilir cihaz bağlanabilir. Ağdaki her bağlı cihaz bir düğüm olarak kabul edilir.

Birden fazla bağlı cihaza sahip olduğunuzda, mesajları hangi düğümlerin alacağını göz önünde bulundurmanız gerekir. Örneğin, giyilebilir cihazda ses verilerini alan bir ses transkripti uygulamasında, mesajı, isteği yerine getirebilecek işlem gücü ve pil kapasitesine sahip bir el cihazı gibi bir düğüme gönderin.

Not: Mesajınızın ayrıntılarını belirtirken birden fazla bağlı düğüm olabileceğini göz önünde bulundurun. Mesajın hedeflenen cihazlara veya düğümlere teslim edildiğinden emin olun.

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

İleti gönderme

Giyilebilir cihaz uygulamaları, kullanıcılara sesli metne dönüştürme gibi işlevler sunabilir. Kullanıcılar giyilebilir cihazlarının mikrofonuna doğru konuşabilir ve bir nota kaydedilebilir. Giyilebilir bir cihaz genellikle sesi metne dönüştürme etkinliğini gerçekleştirmek için gereken işlem gücüne ve pil kapasitesine sahip olmadığından, uygulamanın bu iş yükünü daha yetenekli bir bağlı cihaza yüklemesi gerekir.

Aşağıdaki bölümlerde etkinlik isteklerini işleyebilen cihaz düğümlerinin reklamını yapma, istenen bir ihtiyacı karşılayabilecek düğümleri keşfetme ve bu düğümlere mesaj gönderme hakkında bilgiler verilmektedir.

Avuç içi cihazında, giyilebilir bir cihazdan etkinlik başlatmak için MessageClient sınıfını kullanarak isteği gönderin. Avuç içi cihaza birden fazla giyilebilir cihaz bağlanabildiğinden, giyilebilir uygulamanın bağlı bir düğümün etkinliği başlatabileceğini belirlemesi gerekir. Avuç içi uygulamanızda, üzerinde çalıştığı düğümün belirli özellikler sunduğunu tanıtın.

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 dosyayı wear.xml olarak adlandırın.
  2. wear.xml kaynağı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ı özelliğin wear.xml ürününe nasıl ekleneceği gösterilmektedir:

<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 alın

Başlangıçta, CapabilityClient sınıfının getCapability yöntemini çağırarak özellikli düğümleri tespit edebilirsiniz. Bu yöntemi kullanmak için Wear OS uygulamanızın ve telefon uygulamanızın aynı uygulama kimliği olmalıdır. Aşağıdaki örnekte, voice_transcription özelliğine sahip erişilebilir düğümlerin sonuçlarının manuel olarak nasıl alınacağı gösterilmektedir:

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 algılamak için bir dinleyici örneğini, özellikle de bir CapabilityClient nesnesinin OnCapabilityChangedListener öğesini kaydedin. Aşağıdaki örnekte işleyicinin nasıl kaydedileceği ve voice_transcription özelliğine sahip erişilebilir düğümlere sahip bir sonucun nasıl alınacağı gösterilmektedir:

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. Birden fazla düğümden mesaj yönlendirmesini en aza indirmek için giyilebilir cihazınıza yakın bir düğüm seçin. Yakındaki düğüm, cihaza doğrudan bağlı olan düğüm olarak tanımlanır. 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ında birden fazla düğüm varsa rastgele bir düğüm seçin. Benzer şekilde, yakınlarda uygun düğüm yoksa rastgele uygun bir 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 düğümü belirledikten sonra MessageClient sınıfını kullanarak iletiyi gönderin.

Aşağıdaki örnekte, giyilebilir bir cihazdan transkript yapabilen düğüme nasıl mesaj gönderileceği gösterilmektedir. Bu çağrı eşzamanlıdır ve sistem, mesajı teslim edilmek üzere sıraya alana kadar işlemeyi engeller.

Not: Başarılı bir sonuç kodu, mesajın teslim edileceğini garanti etmez. Uygulamanız veri güvenilirliği gerektiriyorsa cihazlar arasında veri göndermek için DataItem nesneleri veya ChannelClient sınıfını kullanabilirsiniz.

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: Google Play hizmetlerine yapılan eşzamansız ve eşzamanlı çağrılar ile bunların her birinin ne zaman kullanılacağı hakkında daha fazla bilgi edinmek için Tasks API'ye göz atın.

Ayrıca, tüm bağlı düğümlere mesaj yayınlayabilirsiniz. İleti gönderebileceğiniz tüm bağlı düğümleri geri almak 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 istiyorsanız mesaj etkinlikleri için işleyici sağlamak amacıyla MessageClient.OnMessageReceivedListener arayüzünü uygulayın. Daha sonra, işleyiciyi addListener yöntemiyle kaydedin. Aşağıdaki örnekte, VOICE_TRANSCRIPTION_MESSAGE_PATH öğesini kontrol etmek için işleyiciyi nasıl uygulayabileceğiniz gösterilmektedir. Bu koşul true ise ses verilerini işlemek için bir etkinlik başlatın.

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, uygulamayla ilgili daha fazla ayrıntı gerektirir. Tam işleyici hizmetinin veya etkinliğin nasıl uygulanacağını öğrenmek için Veri katmanı etkinliklerini dinleme bölümüne bakın.