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.
Reklam verme özellikleri
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:
- Projenizin
res/values/
dizininde bir XML yapılandırma dosyası oluşturun ve dosyayıwear.xml
olarak adlandırın. wear.xml
kaynağınaandroid_wear_capabilities
adlı bir kaynak ekleyin.- 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.