【问题标题】:Android Wear onDataChanged isn't called未调用 Android Wear onDataChanged
【发布时间】:2016-03-31 12:39:39
【问题描述】:

我下载了一个现成的手机应用程序,并尝试为我的 Android Wear 项目实现一个表盘。目标是将温度信息从手机传递到穿戴设备并让它更新表盘。

我尝试过: 1.相同的包名 2.相同的applicationId 3.相同的依赖版本 4.相同的权限 5. 在我的手机端,我确定我的数据每次都不同(因此必须进行更新)

我还使用数据项,因此我的数据必须得到同步。

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

我首先在手机上运行我的应用程序,确保它运行正常,并且更新了数据项并将数据项发送到我的穿戴设备。然后我运行我的磨损模块并没有收到任何信息,因为从未调用过 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());
        }
    }

非常感谢任何帮助

GitHub_Link

我花了很多时间试图解决这个问题。

【问题讨论】:

    标签: android wear-os


    【解决方案1】:

    在 GitHub 上向您发送了包含更正的拉取请求。 好像你只是忘记连接你的谷歌客户端:)

    mGoogleApiClient.connect();
    

    您的代码中还有一些额外的小改动(一些重构)。

    【讨论】:

      【解决方案2】:

      您必须在 WatchFace 类中创建一个 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
                      }
         }
      

      【讨论】:

        【解决方案3】:

        您是否将 CanvasWatchFaceService 添加为数据更改事件的侦听器?在 onConnected 中确保您调用:

        Wearable.DataApi.addListener(mGoogleApiClient, this);
        

        【讨论】:

          【解决方案4】:

          你应该经常检查:

          1. 您的手机已连接到 Wear
          2. 包名相同
          3. 您在两个应用上使用相同的 Google Play 服务版本
          4. 您正在使用同一个密钥库对移动应用和穿戴式应用进行签名

          我在 GoUbiquitous 上卡住了 10 天,直到我弄清楚最后一个:-\

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-01-20
            • 2023-03-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多