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.
Reklamcılık özellikleri
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:
- Projenizin
res/values/
dizininde bir XML yapılandırma dosyası oluşturun ve dosyayıwear.xml
olarak adlandırın. wear.xml
'yeandroid_wear_capabilities
adlı bir kaynak ekleyin.- 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.