我正在研究udacity可穿戴课程,无法让我的可穿戴模拟器将dataEvents发送到可穿戴设备。
在掌上电脑和可穿戴设备上,我都有扩展WearableListenerService(WLS)的服务。手持设备版本目前通过活动中的startService
呼叫启动,可穿戴服务也通过startService
在表盘服务中启动,两种服务都可以看作已启动。
设备WLS成功调用内容提供程序并尝试将数据发送到可穿戴设备,但永远不会调用putDataItem
resultCallback。
可穿戴设备似乎与我的手机配对,因为我从手机上收到了各种通知,所以设置很好。手持式和可穿戴式模块都将服务添加到清单中,并带有所需的intent-filter,并且通过日志记录,我可以看到它们都按预期启动。
我关注的是docs,但我必须遗漏一些东西。
感谢您的帮助。
public class WeatherDataService extends WearableListenerService implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {
private static final String TAG = "HandheldService";
private GoogleApiClient mGoogleClientApi;
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "initializing");
mGoogleClientApi = new GoogleApiClient.Builder(this)
.addApi(Wearable.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
mGoogleClientApi.connect();
}
@Override
public void onPeerConnected(Node peer) {
super.onPeerConnected(peer);
Log.d(TAG, "onPeerConnected: " + peer.getDisplayName());
String[] temps = getCurrentTemps();
if (temps != null && temps.length == 2) {
Log.d(TAG, String.format("onPeerConnected: temps %s %s", temps[0], temps[1]));
notifyWearables(mGoogleClientApi, temps[0], temps[1]);
}
}
private void notifyWearables(GoogleApiClient client, String low, String high) {
Log.d(TAG, String.format("notifyWearables: %s %s", low, high));
PutDataMapRequest map = PutDataMapRequest.create("/weather");
map.getDataMap().putString("tempLow", low);
map.getDataMap().putString("tempHigh", high);
PutDataRequest request = map.asPutDataRequest();
Wearable.DataApi.putDataItem(client, request).setResultCallback(new ResultCallback<DataApi.DataItemResult>() {
@Override
public void onResult(DataApi.DataItemResult result) {
Log.d(TAG, String.format("onResult, %s", result.getStatus().getStatusMessage()));
if (!result.getStatus().isSuccess()) {
Log.d(TAG, "onResult: Failed to send data");
}
}
});
...
}
public class WeatherDataService extends WearableListenerService {
private static final String TAG = "Wearable:Service";
@Override
public void onCreate() {
super.onCreate();
// this is called
Log.d(TAG, "onCreate");
}
@Override
public void onDataChanged(DataEventBuffer dataEvents) {
// NEVER makes it here
Log.d(TAG, "onDataChanged: ");
for (DataEvent dataEvent : dataEvents) {
Log.d(TAG, "onDataChanged: " + dataEvent.getDataItem().getUri().getPath());
if (dataEvent.getType() == DataEvent.TYPE_CHANGED) {
Log.d(TAG, "onDataChanged: TYPE_CHANGED");
DataMap dataMap = DataMapItem.fromDataItem(dataEvent.getDataItem()).getDataMap();
String path = dataEvent.getDataItem().getUri().getPath();
if (path.equals("/weather")) {
Log.d(TAG, "onDataChanged: /weather");
String tempLow = dataMap.getString("tempLow");
String tempHigh = dataMap.getString("tempHigh");
Log.d(TAG, "onDataChanged: " + tempLow + " " + tempHigh);
}
}
}
}
}
我错过了mGoogleApiClient.connect()
方法调用。现在正在调用putDataItem
resultCallback,不幸的是,没有调用可穿戴设备的onDataChanged
事件。
答案 0 :(得分:0)
onDataChanged
不会调用,因为您不会更改每次发送的任何数据(只有在数据确实发生变化时才会调用),尝试发送不同的数据并且它会起作用,并确保连接您的mGoogleClientApi 在onStrart();
答案 1 :(得分:0)
事实证明,事情有些不对劲。
第一个是@mahmoud提到的,虽然我第一次读它时错过了它,因为需要调用mGoogleClientApi.connect()
。当@mahmoud表示在onStart()中连接到客户端时,我没有读取它作为调用.connect()
方法。
错误的第二件事是清单package
属性与每个模块不匹配。我认为他们需要相同的父命名空间。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.sunshine.app">