可穿戴监听服务中的onDataChanged()方法未被调用。

18
我按照这里发布的指南如何从手持设备发送通知到穿戴设备以打开Activity,尝试通过手机调用穿戴设备上的一个活动。但是,我使用了答案中提供的源代码,但无法运行。看起来onDataChanged()从未被调用。因为这个例子似乎对其他人有效,所以我将其作为一个单独的问题提出。我使用的是KitKat 4.4.2,如果有关系的话,请问在哪里查找解决方法,谢谢。

1
这个问题在这个答案中的示例代码和Android示例中都存在一个问题,即发送的数据项不够唯一。在官方示例中,数据项包含格式为HH:mm的时间,这使得每分钟都是唯一的。如果你将通知滑动删除,只有在分钟数翻转后才能发送新的通知。我的示例也有同样的问题,但我已经修复了。我们还为另一个示例提交了一个错误报告。 - Peter Friese
7个回答

50

你可以检查两个方面:

  • 手表应用的packageName必须与设备应用的packageName完全相同
  • onDataChanged()仅在数据实际更改时才会调用。如果多次将相同的数据放入DataApi中,该方法仅调用一次,直到写入不同的数据为止。您可以向数据添加时间戳以确保该方法每次写操作时都会被调用。但是,使用DataApi在电池使用方面可能更昂贵,而发送消息则更经济实惠。因此,如果您只想在放置数据到DataApi后触发某个操作,则在完成后简单地发送一条消息即可。

3
对我来说,将相同的数据一遍又一遍地发送到onDataChanged()才是解决问题的关键。谢谢! - Keith
7
我在测试过程中添加了 dataMap.getDataMap().putLong("Time",System.currentTimeMillis()); 来确保更改。 - 13rac1
3
你救了我的一天!谢谢! - Takamitsu Mizutori
还有一件事情需要注意,DataItems的有效载荷限制为100KB。如果您的DataItem超过此限制,onDataChanged()也不会被调用。 - Ascot Harris

16

在Play Services 8.3.0版本中,消息可能会延迟高达30分钟。通过新的setUrgent()方法,可以无延迟发送。

最后,如果您正在开发可穿戴设备,您将知道电池寿命和功耗优化对于拥有出色的用户体验至关重要。使用Google Play services 8.3,我们更新了DataApi,允许在数据项同步方式中添加紧急程度。现在,可以为数据项添加优先级以确定何时应该进行同步。例如,如果您正在构建需要立即同步的应用程序(如远程控制应用程序),则仍然可以通过调用setUrgent()立即完成,但对于更新联系人之类的事情,您可以容忍一些延迟。非紧急数据项可能会延迟高达30分钟,但您可以期望它们在大多数情况下会在几分钟内交付。低优先级现在是默认设置,因此需要setUrgent()来获取先前的时间安排。

http://android-developers.blogspot.nl/2015/11/whats-new-in-google-play-services-83.html


经过两天的调查,我没有在任何地方找到这个。谢谢上帝你提到了,在GMS 8.3中消息被延迟,特别是在可穿戴模拟器上。使用setUrgent()方法可以使其恢复正常。 - Raffaeu

6

请确保build.gradle文件中的applicationId在手持设备和可穿戴模块中是相同的。

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "your.applicationid" // needs to be the same in both modules
        minSdkVersion 20
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        targetCompatibility = '1.7'
}

...

2

对我来说,罪魁祸首是服务声明中的这行代码:

android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"

我不确定这行代码具体是怎样导致服务无法接收事件的,但当它被移除后,服务开始正常运作。


1
你是从穿戴应用程序还是从手机中一起卸载了它? - JP Ventura
@JPVentura 很遗憾,我不记得了。 - corazza

2

1. 检查 mobile 和 wear 的 build.gradle 文件,确保使用相同的 play 版本 compile 'com.google.android.gms:play-services-wearable:6.5.87'

我的 mobile 文件中有一个 + 号,这只会在 mobile 上使用最新版本

在两个文件中升级到相同的版本直到它正常工作

2. 愚蠢的解决方法,如果没有任何作用 (!! 如果您按照步骤一操作,则不需要此步骤)

....
Wearable.DataApi.putDataItem(mGoogleApiClient, request)
.......  
this line after your put

Wearable.DataApi.deleteDataItems(mGoogleApiClient, request.getUri());

这是一个复制技巧,它可以完成三个操作:
  • 唤醒配对

  • 发送数据

  • 在两者上执行OnDataChange并使用良好的数据

  • 删除数据(在两者上执行OnDataChange并使用无数据)(因此即使数据被删除也要准备好工作)

我的问题是数据在观察中排队并暂停,直到第一次触摸 - 现在它是实时双向的。

0

-2
在 onDataChanged 方法之后,我正在强制执行:
onDataChanged(DataEventBuffer dataEvents) { --执行数据操作--- mGoogleApiClient.disconnect(); mGoogleApiClient.connect(); }

}

只有使用这个设置,onDataChanged 才能正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接