android 未调用创建和数据更改时的WearableListenerService

8ljdwjyq  于 2022-11-27  发布在  Android
关注(0)|答案(1)|浏览(130)

我正在尝试使用DataClient将数据从电话发送到手表。
我注意的事项:

  • 相同包名
  • 两个模块上都没有构建风格
  • 磨损模块清单的附加服务
  • 相同路径前缀
  • 相同签名配置

我试过this sample project并将部分复制到我的项目中。我找不到任何问题。
示例项目在我的硬件上运行良好,有趣的是,它在模拟器中无法运行。因此,我也仅在硬件上测试了我的应用程序。(泛指el 6 Pro &泛指el 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")
   
}
}

令人惊讶的是,当我在手表上启动应用程序时,日志中没有出现“STARTED SERVICE”。据我所知,这意味着系统不知道侦听器的存在,也没有注册它。因此,下面的清单一定有问题。

这是手表清单中的服务:

<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>

我错过了什么?

jjjwad0x

jjjwad0x1#

结果发现发送部分是罪魁祸首。小心你使用的作用域,或者你是否想使用一个作用域。这个函数在我的代码中的一个工作者内部被调用,所以这不是一个问题。
我完全修改了上面的演示项目,并在此的帮助下,我发现了为什么它不工作。
以下是工作解决方案:

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

相关问题