Как отправить строку через DataItem

Я не могу подключить свой циферблат к мобильному приложению. Я хочу отправить простой текст (при нажатии кнопки на портативном компьютере), чтобы понять, как это работает. К сожалению, я что-то упускаю, потому что у меня нет сообщений на циферблате.

Мой onClickListener в портативном MainActivity

sendDataItem.setOnClickListener {
            val putDataReq: PutDataRequest = PutDataMapRequest.create("/test").run {
                dataMap.putString("key", "TEST TEXT")
                asPutDataRequest()
            }
            val putDataTask: Task<DataItem> = dataClient.putDataItem(putDataReq)
        }

Мой метод переопределения OnDataChanged, который (что я, по крайней мере, хочу сделать) отправляет данные на мой циферблат

override fun onDataChanged(dataEvents: DataEventBuffer) {
            dataEvents.forEach { event ->
                // DataItem changed
                if (event.type == DataEvent.TYPE_CHANGED) {
                    event.dataItem.also { item ->
                        if (item.uri.path.compareTo("/test") == 0) {
                            DataMapItem.fromDataItem(item).dataMap.apply {
                                weatherTemp = getString("key")
                            }
                        }
                    }
                } else if (event.type == DataEvent.TYPE_DELETED) {
                    // DataItem deleted
                }
            }
        }

Мне нужен простой результат. Как только я получу данные, я хочу сохранить их в файле weatherTemp var.

что-нибудь в logcat?

Sterling 11.04.2019 17:24

Я бы просто сказал, что API данных имеет довольно много движущихся частей, которые нужно исправить, и по вашим фрагментам сложно сказать, что может быть неправильным. Одна очевидная вещь заключается в том, что если вы всегда отправляете одно и то же "TEST TEXT", вы никогда не получите onDataChanged, потому что данные не изменение. Но у вас могут быть и другие проблемы. Хорошей тактикой может быть начать с образца API от Google и адаптировать его уже работающий код для вашего варианта использования.

Sterling 11.04.2019 18:28

О, я понимаю, что такое onDataChanged :D Но теперь у меня проблема с логикой моего приложения. У меня есть список опций в носимом устройстве. Является ли элемент данных хорошим способом переключения параметров с портативного устройства? Сегодня я трачу некоторое время на образец Google. Я думаю, что я не получаю часть данных отправки. Могу ли я отправлять данные в onClickListener? И еще, можно ли как-то проверить, успешно ли отправлен элемент данных (например, метод onDataRecived)?

Bartson 11.04.2019 23:35

Насколько я знаю, нет ничего лучше события onDataReceived; в этом мы полностью на милости WearOS. И, вероятно, лучше открыть новый вопрос, касающийся onClickListener, с более подробной информацией о вашей настройке.

Sterling 12.04.2019 17:00

Спасибо, я думаю, что я действительно близок к решению. Но я не могу понять одну вещь. Можно ли как-то получить первые полученные данные? Потому что каждые следующие данные перехватываются onDataChanged, а первые теряются. Спасибо за терпение :D

Bartson 12.04.2019 17:19

Я не понимаю, о чем вы спрашиваете, извините. Никакие данные не должны быть «перехвачены» onDataChanged; все изменения данных должны быть связаны API с этим методом.

Sterling 13.04.2019 19:45
0
6
185
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Я трачу на это некоторое время, но, наконец, у меня это работает. В моем классе циферблата у меня есть метод onDataChange, который получает элемент данных:

override fun onDataChanged(dataEvents: DataEventBuffer) {
            dataEvents.forEach { event ->
                if (event.type == DataEvent.TYPE_CHANGED) {
                    val path = event.dataItem.uri.path
                    event.dataItem.also { item ->
                        if (path.compareTo("/testPath") == 0) {
                            DataMapItem.fromDataItem(item).dataMap.apply {
                               //I'm changing var that is printed on the watchface screen
                                testVar = getInt("key").toString()
                            }
                        }
                    }
                } else if (event.type == DataEvent.TYPE_DELETED) {
                    //DataItem deleted
                } else {
                    //Unknown data type event
                }
            }
        }

Нельзя забывать о:

 Wearable.getDataClient(applicationContext).addListener(this)

в вашем методе onCreate. Я отправляю элемент данных из своего портативного устройства при нажатии кнопки.

sendDataItem.setOnClickListener {
            putDataMapReq = PutDataMapRequest.create("/testPath")
            putDataMapReq.dataMap.putInt("key", testVar++)
            putDataReq = putDataMapReq.asPutDataRequest()
            putDataReq.setUrgent()
            putDataTask = Wearable.getDataClient(applicationContext).putDataItem(putDataReq)
        }

Это не идеально, но, по крайней мере, это работает, и я могу двигаться дальше. Если что-то непонятно, смело пишите комментарий.

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