【问题标题】:How to send String via DataItem如何通过 DataItem 发送字符串
【发布时间】:2019-04-10 11:58:51
【问题描述】:

我无法将我的表盘与手持应用程序连接起来。我想发送一个简单的文本(在手持设备上的单击按钮上)以了解它是如何工作的。不幸的是,我错过了一些东西,因为我在表盘中没有任何消息。

我在手持MainActivity中的onClickListener

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 中的任何内容?
  • 我只是一般地说,数据 API 有相当多的活动部分需要纠正,而且很难从您的 sn-ps 中判断出什么可能是错误的。一件显而易见的事情是,如果您总是发送相同的"TEST TEXT",您将永远不会收到onDataChanged,因为数据不会更改。但你也可能有其他问题。一个好的策略可能是从 Google 的 API 示例开始,并根据您的用例调整其已经工作的代码。
  • 哦,我明白 onDataChanged 的​​意思了:D 但现在我的应用程序逻辑有问题。我在可穿戴设备中有一个选项列表。数据项是从手持设备切换选项的好方法吗?今天我花了一些时间在谷歌样本上。我认为我没有收到发送数据部分。我可以在 onClickListener 中发送数据吗?还有一件事,我能否以某种方式检查数据项是否已成功发送(例如 onDataRecived 方法)?
  • AFAIK,没有什么比得上“onDataReceived”事件了;我们在这方面受到 WearOS 的摆布。最好提出一个关于 onClickListener 的新问题,并提供有关您的设置的更多详细信息。
  • 谢谢,我想我真的很接近解决方案了。但我无法理解一件事。我能以某种方式获得第一个收到的数据吗?因为每一个下一个数据都被 onDataChanged 拦截,但首先丢失了。感谢您的耐心等待:D

标签: android kotlin wear-os android-wear-data-api


【解决方案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)
        }

它并不完美,但至少它可以工作并且我能够继续。如果有任何不清楚的地方,请随时写评论。

【讨论】:

    猜你喜欢
    • 2020-08-16
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多