在我的手表应用程序中,我正在使用检索和更新值的ViewModel。
会话完成后,数据被“包裹”(我在名为Common的第三个模块上具有数据类SessionData,它在手表和电话应用程序之间共享),我使用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()
}
}
路径是
"/session-data"
然后,我在手机应用程序上使用了我的侦听器,并带有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 Y.O.主题,他们建议手机和手表必须具有相同的应用程序ID。同样,我认为我需要节点ID来发送数据,但仅用于MessageClient,而不是DataClient。
我还进行了一些基本检查:在同一WiFi上观看和电话彼此正确连接,还登录了相同的Google帐户(以及相同的三星帐户)。我不纪念手表并修理了。我将手表完全重置,然后将其修理到电话上。截至2025年1月(24.49.33-705592033),我手表上的Google服务是最新的,并且在电话中,Google Play服务是完全允许的,并且优先级。在手机清单中,Google服务可穿戴。我有dureable.bind.listener和dureable.data.changed。数据路径很好,例如“/session-data".
电话清单:
<service
android:name=".MyDataLayerListenerService"
android:exported="true"
android:permission="com.google.android.gms.permission.WEARABLE_BIND_LISTENER">
<!-- If you want to listen for data changes at a specific path, declare a DATA_CHANGED action
and optionally specify a pathPrefix to filter for certain paths (like "/session-data"). -->
<intent-filter>
<!-- Listen for data changes -->
<action android:name="com.google.android.gms.wearable.DATA_CHANGED" />
<!-- (Optional) If you only care about a specific path in the data layer, add <data>: -->
<data
android:scheme="wear"
android:host="*"
android:pathPrefix="/session-data" />
</intent-filter>
</service>
在Gradle文件中识别并声明了所有模块(手表,电话,常见)。
我试图开发一个简单的项目,只是为了将一个简单的字符串从我的手表传递到电话,但无法正常工作。
请审查以下内容
安全要求,否则您的应用不会相互通信:
包装名称必须匹配跨设备。
包装的签名必须匹配设备。
其他有关此主题的信息/教程的来源:
Github中的
WearOS样品回购中的datalayer样品;
来自Github的Hordossic repo的Datalayer助手;