Я написал на Kotlin приложение WearOs для фигуристов. Во время сеанса он записывает несколько данных, таких как дата сеанса, продолжительность, средняя и максимальная скорость, пройденное расстояние, частота сердечных сокращений, сожженные калории и т. д.
Я также закодировал в том же проекте, приложение для сопутствующего телефона (второй модуль), которое должно получать данные. В приложении для телефона я нажимаю «сеанс произвольного катания», и должна появиться дата сеанса, нажимаю на дату и отображаю другие значения в ленивом столбце.
Проблема в том, что я не могу отправить данные в приложение для телефона.
В приложении для часов я использую ViewModel, который извлекает и обновляет значения.
В моем приложении для часов я использую ViewModel, который извлекает и обновляет значения.
p>
По завершении сеанса данные "parcelized" (у меня есть класс данных SessionData в третьем модуле с именем common, он используется приложением для часов и телефона), и я использую putDataMapRequest для их отправки:
Код: Выделить всё
suspend fun sendSessionDataToDataLayer(sessionData: SessionData, context: Context) {
val bundle = Bundle().apply {
putParcelable("sessionData", sessionData)
}
val putDataMapRequest = PutDataMapRequest.create("/session-data").apply {
dataMap.putAll(DataMap.fromBundle(bundle))
}
val putDataRequest = putDataMapRequest.asPutDataRequest()
try {
Log.d("sendSessionDataToDataLayer", "Sending session data: $sessionData")
Wearable.getDataClient(context).putDataItem(putDataRequest).await()
Log.d("sendSessionDataToDataLayer", "Data sent successfully")
// Show a toast to the user on the watch
Toast.makeText(context, "Data queued for transfer", Toast.LENGTH_SHORT).show()
resetSession() // Only reset after successful data transfer
} catch (e: Exception) {
Log.e("sendSessionDataToDataLayer", "Failed to send session data", e)
// Optionally show an error toast
Toast.makeText(context, "Data send failed: ${e.message}", Toast.LENGTH_SHORT).show()
}
}
Всплывающее сообщение, которое я получаю: «данные поставлены в очередь для передачи». "
Затем у меня есть прослушиватель в приложении для телефона с функцией OnDatachanged. Предполагается получить данные и распаковать их. Но OnDataChanged никогда не срабатывает...
Код: Выделить всё
class MyDataLayerListenerService : WearableListenerService() {
override fun onDataChanged(dataEvents: DataEventBuffer) {
// Indicate that onDataChanged was called at all
Toast.makeText(this, "onDataChanged triggered!", Toast.LENGTH_SHORT).show()
dataEvents.forEach { event ->
if (event.type == DataEvent.TYPE_CHANGED && event.dataItem.uri.path == "/session-data") {
try {
val dataMap = DataMapItem.fromDataItem(event.dataItem).dataMap
val bundle = dataMap.toBundle()
val sessionData: SessionData? = bundle.getParcelable("sessionData")
if (sessionData != null) {
Toast.makeText(this, "Received session data!", Toast.LENGTH_SHORT).show()
saveSessionDataLocally(sessionData)
} else {
Toast.makeText(this, "SessionData is null", Toast.LENGTH_SHORT).show()
}
} catch (e: Exception) {
Toast.makeText(this, "Failed to parse session data: ${e.message}", Toast.LENGTH_LONG).show()
}
}
}
}
private fun saveSessionDataLocally(sessionData: SessionData) {
// e.g. show a final toast
Toast.makeText(this, "Session data saved: ${sessionData.distanceSkated}", Toast.LENGTH_SHORT).show()
}
Я добавил всплывающие уведомления, чтобы иметь представление, где это не удается. По завершении сеанса во всплывающем сообщении отображается сообщение «данные поставлены в очередь для передачи». Так что, похоже, часы считают, что работа выполнена правильно. Я также добавил всплывающие уведомления на телефон, но они никогда не отображаются. Просто пустая страница вместо даты катания.
В 10 лет. теме рекомендовали, чтобы телефон и часы имели одинаковый идентификатор приложения. Точно так же я подумал, что для отправки данных мне нужны идентификаторы узлов, но это только для MessageCLient, а не DataClient.
Я также провел несколько базовых проверок: часы и телефон правильно подключены друг к другу, а также вошел в ту же учетную запись Google (и ту же учетную запись Samsung, чего бы это ни стоило), по тому же Wi-Fi. Я отсоединил часы и отремонтировал. Я полностью перезагрузил часы и восстановил их на телефоне. Службы Google на моих часах обновлены по состоянию на январь 2025 г. (24.49.33-705592033), а на телефоне службы Google Play полностью разрешены и имеют высокий приоритет.
В Телефонный манифест, носимые сервисы Google есть. У меня есть Wearable.Bind.Listener и Wearable.data.changed. Путь к данным хороший, например. "/session-data".
Манифест телефона:
Код: Выделить всё
Я пытался разработать простой проект, просто чтобы передать простую строку с часов на телефон, но не смог заставить ее работать.
Подробнее здесь: https://stackoverflow.com/questions/793 ... aclient-go