Wear'da mesaj gönderip alın

MessageClient API'yi kullanarak ileti gönderiyor ve iletiye aşağıdaki öğeleri ekliyorsunuz:

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

Veri öğelerinde olduğu gibi, elde taşınan cihaz ve giyilebilir cihaz uygulamaları arasında senkronizasyon gerçekleşmez. Mesajlar, uzak yordam çağrıları (RPC) için yararlı olan tek yönlü bir iletişim mekanizmasıdır. Örneğin, bir etkinliği başlatmak için giyilebilir cihaza mesaj gönderme gibi.

Bir kullanıcının elde taşınabilir cihazına birden fazla giyilebilir cihaz bağlanabilir. Ağdaki her bağlı cihaz bir düğüm olarak kabul edilir.

Birden fazla bağlı cihaz olduğunda, mesajları hangi düğümlerin alacağını göz önünde bulundurmanız gerekir. Örneğin, giyilebilir cihazda ses verileri alan bir sesli metne dönüştürme uygulamasında, mesajı isteği işleyecek işlem gücüne ve pil kapasitesine sahip bir düğüme (ör. elde taşınabilir bir cihaz) gönderin.

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

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

Mesaj gönder

Giyilebilir cihaz uygulamaları, kullanıcılara ses transkripsiyonu gibi işlevler sunabilir. Kullanıcılar, giyilebilir cihazlarının mikrofonuna konuşarak not olarak kaydedilen bir transkript oluşturabilir. Giyilebilir cihazlarda genellikle ses transkripsiyonu etkinliğini işlemek için gereken işlem gücü ve pil kapasitesi bulunmadığından uygulamanın bu işi daha yetenekli bir bağlı cihaza aktarması gerekir.

Aşağıdaki bölümlerde, etkinlik isteklerini işleyebilen cihaz düğümlerinin nasıl reklamının yapılacağı, istenen bir ihtiyacı karşılayabilen düğümlerin nasıl keşfedileceği ve bu düğümlere nasıl mesaj gönderileceği gösterilmektedir.

Bir etkinliği giyilebilir cihazdan el cihazında başlatmak için isteği göndermek üzere MessageClient sınıfını kullanın. Elde taşınan cihaza birden fazla giyilebilir cihaz bağlanabildiğinden giyilebilir cihaz uygulaması, bağlı bir düğümün etkinliği başlatıp başlatamayacağını belirlemelidir. Elde taşınabilir uygulamanızda, üzerinde çalıştığı düğümün belirli işlevler sağladığını belirtin.

Elde taşınabilir cihaz 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'ye android_wear_capabilities adlı bir kaynak ekleyin.
  3. Cihazın sağladığı özellikleri tanımlayın.

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

Aşağıdaki örnekte, voice_transcription adlı bir özelliğin wear.xml öğesine nasıl ekleneceği gösterilmektedir:

<resources xmlns:tools="http://schemas.android.com/tools"
           tools:keep="@array/android_wear_capa<bilities">
    string-array name="android_<wear_capabilities"&<gt;
       < item>voice_<transcription/item>
    /string-array>
/resources>

Gerekli özelliklere sahip düğümleri alma

Başlangıçta, getCapability sınıfının CapabilityClient yöntemini çağırarak uygun düğümleri algılayabilirsiniz. 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 örnekte, voice_transcription özelliğiyle 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);
}

Dikkat: Wearable Data Layer API'yi kullanmadan önce API'nin cihazda kullanılabilir olduğunu kontrol edin. Aksi takdirde istisna oluşur. Horologist'te uygulandığı gibi GoogleApiAvailability sınıfını kullanın.

Uygun düğümleri giyilebilir cihaza bağlandıklarında algılamak için bir dinleyici örneği kaydedin. Bu örnek, özellikle bir OnCapabilityChangedListener nesnesinin CapabilityClient olmalıdır. Aşağıdaki örnekte, işleyicinin nasıl kaydedileceği ve voice_transcription özelliğine sahip erişilebilir düğümlerle nasıl sonuç 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);
}

İletinin nereye gönderileceğini belirlemek için uygun düğümleri algılayın. Mesaj yönlendirmeyi birden fazla düğüm üzerinden 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 üzerinden 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ında uygun bir düğüm yoksa rastgele bir uygun 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 mesajı gönderin.

Aşağıdaki örnekte, transkripsiyon özelliğine sahip düğüme giyilebilir bir cihazdan nasıl mesaj gönderileceği gösterilmektedir. Bu çağrı eşzamanlıdır ve sistem, mesajı teslimat için sıraya alana kadar işlemeyi engeller.

Not: Başarılı bir sonuç kodu, iletinin teslim edileceğini garanti etmez. Uygulamanızda veri güvenilirliği gerekiyorsa cihazlar arasında veri göndermek için DataItem nesneleri veya ChannelClient sınıfını kullanmayı düşünebilirsiniz.

Kotlin

const val VOICE_TRANSCRIPTION_MESSAGE_PATH = "/voice_transcription"
...
private fun requestTranscription(voiceData: ByteArray) {
    transcriptionNodeId?.also >{ nodeId -
        val send<T>ask: 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) {
  <      T>askInteger 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 Hizmetleri'ne yapılan eşzamansız ve eşzamanlı çağrılar ile her birinin ne zaman kullanılacağı hakkında daha fazla bilgi edinmek için Tasks API'yi inceleyin.

Ayrıca, tüm bağlı düğümlere mesaj yayınlayabilirsiniz. Mesaj gönderebileceğiniz tüm bağlı düğümleri 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 mesajlardan haberdar olmak için mesaj etkinlikleri için bir dinleyici sağlamak üzere MessageClient.OnMessageReceivedListener arayüzünü uygulayın. Ardından, dinleyiciyi 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 için daha fazla uygulama ayrıntısı gerekiyor. Veri katmanı etkinliklerini işleme başlıklı makalede tam dinleyici hizmeti veya etkinliği uygulama hakkında bilgi edinin.