Я пытаюсь отправить данные с помощью DataClient с телефона на часы.
Вещи, которые я искал:
Я попробовал этот образец проекта и скопировал части в свой проект. Я просто не могу найти никаких проблем с этим.
Пример проекта отлично работал на моем оборудовании, но, что интересно, он не работал в эмуляторе. Поэтому я также тестировал свое приложение только на своем оборудовании. (Pixel 6 Pro и Pixel Watch)
Часть отправки данных, кажется, работает, так как она ведет себя так же, как и пример проекта.
Как я отправляю данные с телефона:
class WearDataManager(val context: Context) {
private val dataClient by lazy { Wearable.getDataClient(context) }
companion object {
private const val CLIENTS_PATH = "/clients"
private const val CLIENT_LIST_KEY = "clientlist"
}
fun sendClientList(clientList: MutableList<String>) {
GlobalScope.launch {
try {
val request = PutDataMapRequest.create(CLIENTS_PATH).apply {
dataMap.putStringArray(CLIENT_LIST_KEY, arrayOf("clientList, test"))
}
.asPutDataRequest()
.setUrgent()
val result = dataClient.putDataItem(request).await()
Log.d("TAG", "DataItem saved: $result")
} catch (cancellationException: CancellationException) {
throw cancellationException
} catch (exception: Exception) {
Log.d("TAG", "Saving DataItem failed: $exception")
}
}
}
}
Вот как я получаю данные о часах:
class WearableListenerService: WearableListenerService() {
companion object {
const val CLIENTS_PATH = "/clients"
}
override fun onCreate() {
super.onCreate()
Log.d("testing", "STARTED SERVICE")
}
override fun onDataChanged(dataEvents: DataEventBuffer) {
super.onDataChanged(dataEvents)
Log.d("testing", "RECEIVED $dataEvents")
}
}
Удивительно, но «СТАРТ СЛУЖБЫ» не появляется в журнале, когда я запускаю приложение на часах. Насколько я понимаю, это означает, что система не знает о существовании слушателей и не регистрирует их. Так что что-то должно быть не так с манифестом ниже.
Это сервис внутри манифеста на часах:
<service android:name = ".wear.communication.WearableListenerService"
android:exported = "true">
<intent-filter>
<action android:name = "com.google.android.gms.wearable.DATA_CHANGED" />
<data
android:host = "*"
android:pathPrefix = "/clients"
android:scheme = "wear" />
</intent-filter>
</service>
Что мне здесь не хватает?
Да, я пытался удалить и переустановить приложение и протестировал отправку данных с открытым приложением в фоновом режиме. До сих пор нет ответа от службы
Оказывается, виновата отправляющая часть. Будьте осторожны с тем, какую область вы используете, и если вы вообще хотите ее использовать. Эта функция вызывается внутри рабочего в моем коде, поэтому это не проблема.
Я полностью модифицировал демонстрационный проект выше и с его помощью выяснил, почему он не работает.
Это рабочее решение:
fun sendClientList(clientList: MutableList<String>) {
val request = PutDataMapRequest.create(CLIENTS_PATH).apply {
dataMap.putStringArray(CLIENT_LIST_KEY, arrayOf(clientList.joinToString()))
}
.asPutDataRequest()
.setUrgent()
val result = dataClient.putDataItem(request)
Log.d("TAG", "DataItem saved: $result")
}
Работает ли это, если приложение уже запущено? Службы приложений, которые принудительно остановлены или никогда не запускались, могут быть не активированы.