Android Wear DataItem Синхронизация / параллельное использование Google сейчас

Я разрабатываю приложение для Android износа, который собирает данные датчика (например, ускорение,..) и синхронизирует его с соответствующим приложением на мобильном телефоне. Каждый раз, когда датчик срабатывает (onSensorChanged), выполняется следующий код:

Runnable runnable = new Runnable() {
        @Override
        public void run() {
            PutDataMapRequest dataMap = PutDataMapRequest.create(WearConstants.WTP_SENSOR_DATA_CHANGED + sensorType);

            dataMap.getDataMap().putInt(WearConstants.ACCURACY, accuracy);
            dataMap.getDataMap().putLong(WearConstants.TIMESTAMP_WEAR, timestamp);
            dataMap.getDataMap().putFloatArray(WearConstants.VALUES, values);

            Wearable.DataApi.putDataItem(mApiClient, dataMap.asPutDataRequest()).setResultCallback(new ResultCallback<DataApi.DataItemResult>() {
                    @Override
                    public void onResult(DataApi.DataItemResult dataItemResult) {
                        Log.d(TAG, "Sending sensor data: " + dataItemResult.getStatus().isSuccess());
                    }
                });
        }
}; Thread thread = new Thread(runnable); thread.start();

Это работает довольно хорошо, данные датчика передаются на мобильный телефон и отображаются в приложении. Вторая особенность приложения - это возможность делать заметки. Есть две возможности делать заметки: а) нажать кнопку, когда приложение открыто, и б) вызвать "Ok Google, сделай заметку", когда приложение закрыто. (см. документацию Google)

Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());
startActivityForResult(intent, WearConstants.W_SPEECH);


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    switch (requestCode) {
        case WearConstants.W_SPEECH: {
            if (resultCode == RESULT_OK && data != null) {
                List<String> results = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
                String spokenText = results.get(0);
                sendSpeech(spokenText);

            }
        }

    }
}

Это тоже хорошо работает, но только если приложение не прослушивает изменения датчика. И это проблема: каждый раз, когда я запускаю голосовое действие, пока приложение (или фоновая служба) прослушивает изменения датчика, голос не распознается, и я получаю сообщение об ошибке "Google недоступен". Мне кажется, что на соединении BluetoothLE недостаточно места. Поэтому я попытался пакетировать данные датчика (в ArrayList) и приостановить отправку на мобильный телефон во время прослушивания голосовых команд, но не было никакой разницы. После пяти дней попыток найти решение я становлюсь немного отчаянным:-) Я надеюсь, что у вас есть новые идеи или советы, что попробовать дальше.

1 ответ

Решение

После нескольких дополнительных исследований, похоже, я наконец-то нашел решение: когда я пытался пакетировать данные датчика при первом запуске, я только приостанавливал отправку. Но когда мой лимит был достигнут, я все равно отправлял каждое значение отдельно. Это была большая ошибка. После изменения моего элемента данных, включающего массив карт данных, использование батареи и производительность выглядят довольно хорошо. Это код, который я использую сейчас:



    DataMap dataMap = PutDataMapRequest.create(WearConstants.WTP_SENSOR_DATA_CHANGED + sensorType).getDataMap();
    dataMap.putInt(WearConstants.SENSOR, sensorType);
    dataMap.putInt(WearConstants.ACCURACY, accuracy);
    dataMap.putLong(WearConstants.TIMESTAMP_WEAR, timestamp);
    dataMap.putFloatArray(WearConstants.VALUES, values);

    dataMaps.add(dataMap);

    if(dataMaps.size() > maxMaps) {
        final ArrayList dataMapsCopy = (ArrayList) dataMaps.clone();
        dataMaps.clear();

        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                PutDataMapRequest dataMap = PutDataMapRequest.create(WearConstants.WTP_SENSOR_DATA_CHANGED + WearConstants.BATCH);
                dataMap.getDataMap().putDataMapArrayList(WearConstants.DATA_ARRAY, dataMapsCopy);
                Wearable.DataApi.putDataItem(mApiClient, dataMap.asPutDataRequest()).setResultCallback(new ResultCallback() {
                    @Override
                    public void onResult(DataApi.DataItemResult dataItemResult) {
                        Log.d(TAG, "Sending sensor data: " + dataItemResult.getStatus().isSuccess());
                    }
                });
            }
        };

        Thread thread = new Thread(runnable);
        thread.start();
    }

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