Android Wear onDataChanged не вызывается

Я загрузил готовое приложение для телефона и пытаюсь реализовать Watchface для моего проекта Android Wear. Цель состоит в том, чтобы передать информацию о температуре с телефона на износное устройство и заставить его обновить циферблат.

Я попытался: 1. То же имя пакета 2. Тот же ID приложения 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

Я потратил много времени, пытаясь решить эту проблему.

4 ответа

Решение

Отправил вам запрос на GitHub с исправлениями. Похоже, вы просто забыли подключить свой клиент Google:)

mGoogleApiClient.connect();

И некоторые дополнительные небольшие изменения в вашем коде (некоторые рефакторинг).

Вы должны создать BroadcastReceiver в своем классе WatchFace и зарегистрировать его с помощью метода 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 );
    }

Наконец, на onDataChanged вашего WatchListenerService отправьте данные через 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
                }
   }

Вы добавили свой CanvasWatchFaceService в качестве прослушивателя событий изменения данных? В onConnected убедитесь, что вы звоните:

Wearable.DataApi.addListener(mGoogleApiClient, this);

Вы должны всегда проверять, если:

  1. Ваш мобильный связан с износом
  2. Имена пакетов одинаковы
  3. Вы используете одну и ту же версию сервиса Google Play в обоих приложениях
  4. Вы подписываете мобильные и надетые приложения, используя одно хранилище ключей

Я застрял на GoUbiquitous на 10 дней, пока я не выясню последний.

Другие вопросы по тегам