Android 未调用 Wear onDataChanged
Android Wear onDataChanged isn't called
我下载了一个现成的 phone 应用程序并尝试为我的 android wear 项目实现一个表盘。目标是将温度信息从 phone 传递到穿戴设备并让它更新表盘。
我试过:
1.相同的包名
2.相同的applicationId
3.相同的依赖版本
4.相同的权限
5. 在我 phone 方面,我确信我的数据每次都不一样(因此必须进行更新)
我也使用数据项,所以我的数据必须同步。
private void syncWatch(String min, String max, int image){
Log.v("SunshineSyncAdapter", "syncWatch");
String time = String.valueOf(new Date().getTime());
PutDataMapRequest putDataMapRequest = PutDataMapRequest.create("/weather-update");
putDataMapRequest.getDataMap().putLong("time", new Date().getTime()); // MOST IMPORTANT LINE FOR TIMESTAMP
putDataMapRequest.getDataMap().putString("min-temp", min + time);
putDataMapRequest.getDataMap().putString("max-temp", max + time);
Log.v("SunshineSyncAdapter", min + time + " " + max + time);
PutDataRequest request = putDataMapRequest.asPutDataRequest();
if (mGoogleApiClient == null){
Log.v("SunshineSyncAdapter", "NOOOOOOOOOOOOOOOOO, life is no good");
return;
}
Wearable.DataApi.putDataItem(mGoogleApiClient,request).setResultCallback(new ResultCallback<DataApi.DataItemResult>() {
@Override
public void onResult(DataApi.DataItemResult dataItemResult) {
if (!dataItemResult.getStatus().isSuccess()) {
Log.v("MainActivity", "Something went wrong, watch was not notified");
} else {
Log.v("MainActivity", "Success, Watch Notified");
}
}
});
}
我首先 运行 我在 phone 上的应用程序确保它 运行 正确并且它更新并将数据项发送到我的穿戴设备。然后我 运行 我的磨损模块并没有收到任何东西,因为永远不会调用 onDataChanged 方法。
@Override
public void onDataChanged(DataEventBuffer dataEvents) {
Log.v("SunshineWatchFace", "onDataChanged");
try{
for(DataEvent dataEvent: dataEvents){
if(dataEvent.getType() != DataEvent.TYPE_CHANGED){
continue;
}
DataItem dataItem = dataEvent.getDataItem();
if(dataItem.getUri().getPath().compareTo("weather_update") == 0){
DataMap dataMap = DataMapItem.fromDataItem(dataItem).getDataMap();
minTemp = dataMap.getString("min-temp");
maxTemp = dataMap.getString("max-temp");
weatherImage = dataMap.getInt("weather-image");
Log.v("SunshineWatchFace", minTemp);
Log.v("SunshineWatchFace", maxTemp);
}
}
dataEvents.release();
if(!isInAmbientMode()){
invalidate();
}
}catch (Exception e){
Log.v("SunshineWatchFace",e.getMessage());
}
}
非常感谢任何帮助
我花了很多时间试图解决这个问题。
您是否将 CanvasWatchFaceService 添加为数据更改事件的侦听器?在 onConnected 确保你调用:
Wearable.DataApi.addListener(mGoogleApiClient, this);
你应该经常检查是否:
- 您的手机已连接到手表
- 包名相同
- 您在两个应用程序上使用相同的 Google Play 服务版本
- 您正在使用同一个密钥库签署移动应用和可穿戴应用
我在 GoUbiquitous 上卡了 10 天,直到我弄清楚最后一个:-\
您必须在 WatchFace class 中创建一个 BroadcastReceiver,并在 registerReceiver() 方法下注册它。
先创建BroadcastReceiver,例如:
final BroadcastReceiver mWeatherReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// Get the data from the intent here
// and set the variables you're going to use in your onDraw method
}
};
然后注册接收者,例如:
private void registerReceiver() {
//This is where you have the default watch face receiver
// Register your new weather receiver
IntentFilter weatherFilter = new IntentFilter("ACTION_WEATHER_CHANGED");
SunshineWatchFace.this.registerReceiver(mWeatherReceiver, weatherFilter );
}
最后,在您的WatchListenerService 的onDataChanged 上,通过Intent 将数据发送到BroadcastReceiver。例如:
@Override
public void onDataChanged(DataEventBuffer dataEvents) {
// Check the data type
if (event.getType() == DataEvent.TYPE_CHANGED) {
// Get the data map
dataMap = DataMapItem.fromDataItem(event.getDataItem()).getDataMap();
Log.i(LOG_TAG, "DataMap received on watch: " + dataMap);
// Get the data map items
String sunshine_temperature_high = dataMap.getString("sunshine_temperature_high");
String sunshine_temperature_low = dataMap.getString("sunshine_temperature_low");
// Create the intent
Intent send_weather = new Intent("ACTION_WEATHER_CHANGED");
send_weather.putExtra("sunshine_temperature_high", sunshine_temperature_high);
send_weather.putExtra("sunshine_temperature_low", sunshine_temperature_low);
// Broadcast it
sendBroadcast(send_weather);
}
else if (event.getType() == DataEvent.TYPE_DELETED) {
// DataItem deleted
}
}
在 GitHub 上向您发送了包含更正的拉取请求。
好像你只是忘记连接你的 google 客户端 :)
mGoogleApiClient.connect();
以及您的代码中的一些额外小改动(一些重构)。
我下载了一个现成的 phone 应用程序并尝试为我的 android wear 项目实现一个表盘。目标是将温度信息从 phone 传递到穿戴设备并让它更新表盘。
我试过: 1.相同的包名 2.相同的applicationId 3.相同的依赖版本 4.相同的权限 5. 在我 phone 方面,我确信我的数据每次都不一样(因此必须进行更新)
我也使用数据项,所以我的数据必须同步。
private void syncWatch(String min, String max, int image){
Log.v("SunshineSyncAdapter", "syncWatch");
String time = String.valueOf(new Date().getTime());
PutDataMapRequest putDataMapRequest = PutDataMapRequest.create("/weather-update");
putDataMapRequest.getDataMap().putLong("time", new Date().getTime()); // MOST IMPORTANT LINE FOR TIMESTAMP
putDataMapRequest.getDataMap().putString("min-temp", min + time);
putDataMapRequest.getDataMap().putString("max-temp", max + time);
Log.v("SunshineSyncAdapter", min + time + " " + max + time);
PutDataRequest request = putDataMapRequest.asPutDataRequest();
if (mGoogleApiClient == null){
Log.v("SunshineSyncAdapter", "NOOOOOOOOOOOOOOOOO, life is no good");
return;
}
Wearable.DataApi.putDataItem(mGoogleApiClient,request).setResultCallback(new ResultCallback<DataApi.DataItemResult>() {
@Override
public void onResult(DataApi.DataItemResult dataItemResult) {
if (!dataItemResult.getStatus().isSuccess()) {
Log.v("MainActivity", "Something went wrong, watch was not notified");
} else {
Log.v("MainActivity", "Success, Watch Notified");
}
}
});
}
我首先 运行 我在 phone 上的应用程序确保它 运行 正确并且它更新并将数据项发送到我的穿戴设备。然后我 运行 我的磨损模块并没有收到任何东西,因为永远不会调用 onDataChanged 方法。
@Override
public void onDataChanged(DataEventBuffer dataEvents) {
Log.v("SunshineWatchFace", "onDataChanged");
try{
for(DataEvent dataEvent: dataEvents){
if(dataEvent.getType() != DataEvent.TYPE_CHANGED){
continue;
}
DataItem dataItem = dataEvent.getDataItem();
if(dataItem.getUri().getPath().compareTo("weather_update") == 0){
DataMap dataMap = DataMapItem.fromDataItem(dataItem).getDataMap();
minTemp = dataMap.getString("min-temp");
maxTemp = dataMap.getString("max-temp");
weatherImage = dataMap.getInt("weather-image");
Log.v("SunshineWatchFace", minTemp);
Log.v("SunshineWatchFace", maxTemp);
}
}
dataEvents.release();
if(!isInAmbientMode()){
invalidate();
}
}catch (Exception e){
Log.v("SunshineWatchFace",e.getMessage());
}
}
非常感谢任何帮助
我花了很多时间试图解决这个问题。
您是否将 CanvasWatchFaceService 添加为数据更改事件的侦听器?在 onConnected 确保你调用:
Wearable.DataApi.addListener(mGoogleApiClient, this);
你应该经常检查是否:
- 您的手机已连接到手表
- 包名相同
- 您在两个应用程序上使用相同的 Google Play 服务版本
- 您正在使用同一个密钥库签署移动应用和可穿戴应用
我在 GoUbiquitous 上卡了 10 天,直到我弄清楚最后一个:-\
您必须在 WatchFace class 中创建一个 BroadcastReceiver,并在 registerReceiver() 方法下注册它。
先创建BroadcastReceiver,例如:
final BroadcastReceiver mWeatherReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// Get the data from the intent here
// and set the variables you're going to use in your onDraw method
}
};
然后注册接收者,例如:
private void registerReceiver() {
//This is where you have the default watch face receiver
// Register your new weather receiver
IntentFilter weatherFilter = new IntentFilter("ACTION_WEATHER_CHANGED");
SunshineWatchFace.this.registerReceiver(mWeatherReceiver, weatherFilter );
}
最后,在您的WatchListenerService 的onDataChanged 上,通过Intent 将数据发送到BroadcastReceiver。例如:
@Override
public void onDataChanged(DataEventBuffer dataEvents) {
// Check the data type
if (event.getType() == DataEvent.TYPE_CHANGED) {
// Get the data map
dataMap = DataMapItem.fromDataItem(event.getDataItem()).getDataMap();
Log.i(LOG_TAG, "DataMap received on watch: " + dataMap);
// Get the data map items
String sunshine_temperature_high = dataMap.getString("sunshine_temperature_high");
String sunshine_temperature_low = dataMap.getString("sunshine_temperature_low");
// Create the intent
Intent send_weather = new Intent("ACTION_WEATHER_CHANGED");
send_weather.putExtra("sunshine_temperature_high", sunshine_temperature_high);
send_weather.putExtra("sunshine_temperature_low", sunshine_temperature_low);
// Broadcast it
sendBroadcast(send_weather);
}
else if (event.getType() == DataEvent.TYPE_DELETED) {
// DataItem deleted
}
}
在 GitHub 上向您发送了包含更正的拉取请求。 好像你只是忘记连接你的 google 客户端 :)
mGoogleApiClient.connect();
以及您的代码中的一些额外小改动(一些重构)。