WearableListenerService onCreate и onDataChanged не вызываются

Я пытаюсь отправить данные с помощью 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>

Что мне здесь не хватает?

Работает ли это, если приложение уже запущено? Службы приложений, которые принудительно остановлены или никогда не запускались, могут быть не активированы.

Yuri Schimke 26.11.2022 13:41

Да, я пытался удалить и переустановить приложение и протестировал отправку данных с открытым приложением в фоновом режиме. До сих пор нет ответа от службы

BlazeCodeDev 26.11.2022 15:33
1
2
97
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Оказывается, виновата отправляющая часть. Будьте осторожны с тем, какую область вы используете, и если вы вообще хотите ее использовать. Эта функция вызывается внутри рабочего в моем коде, поэтому это не проблема.

Я полностью модифицировал демонстрационный проект выше и с его помощью выяснил, почему он не работает.

Это рабочее решение:

 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")
}

Другие вопросы по теме