WearableSensorListener onDataChanged никогда не вызывается
Я недавно начал работать на устройствах Android, и я хотел бы собирать данные датчиков с Android Watch.
Мне удалось использовать API сообщений, но API данных у меня не работал. Я проверил:
/questions/12833659/wearablelistenerservice-ondatachanged-ne-vyizyivaetsya/12833665#12833665
OnDataChanged никогда не вызывается
Android Wear onDataChanged не вызывается
Но никто из них не работал для меня.
Мой код на часах:
@Override
public void onCreate() {
super.onCreate();
// sensor registration
// ......
googleApiClient = new GoogleApiClient.Builder(this)
.addApi(Wearable.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
googleApiClient.connect();
Log.i(this.getClass().toString(), "Google API Client connected");
}
private void sendSensorResult(SensorEvent event) {
if (!googleApiClient.isConnected())
googleApiClient.connect();
PutDataMapRequest putDataMapRequest = PutDataMapRequest.create(DATA_API_PATH);
putDataMapRequest.getDataMap().putLong("UNIX_TIME", System.currentTimeMillis());
putDataMapRequest.getDataMap().putInt("TYPE", event.sensor.getType());
// nanosecond
putDataMapRequest.getDataMap().putLong("TIME", event.timestamp);
putDataMapRequest.getDataMap().putFloatArray("DATA", event.values);
PutDataRequest request = putDataMapRequest.asPutDataRequest().setUrgent();
Wearable.DataApi.putDataItem(googleApiClient, request)
.setResultCallback(new ResultCallback<DataApi.DataItemResult>() {
@Override
public void onResult(@NonNull DataApi.DataItemResult dataItemResult) {
if (dataItemResult.getStatus().isSuccess()) {
Log.i(this.getClass().toString(), "Sent: " + event.toString());
} else {
Log.i(this.getClass().toString(), "FAILED TO SEND: " + event.toString());
}
}
});
}
На телефоне:
public void onDataChanged(DataEventBuffer dataEvents) {
Log.i(this.getClass().toString(), "Got data at " + System.currentTimeMillis());
for (DataEvent dataEvent : dataEvents) {
Log.i(this.getClass().toString(), "Got event: " + dataEvent.toString());
if (dataEvent.getType() == DataEvent.TYPE_CHANGED) {
DataMap dataMap = DataMapItem.fromDataItem(dataEvent.getDataItem()).getDataMap();
String path = dataEvent.getDataItem().getUri().getPath();
if (path.equals(DATA_API_PATH)) {
int type = dataMap.getInt("TYPE");
long time = dataMap.getLong("TIME");
float[] data = dataMap.getFloatArray("DATA");
String message = String.format(Locale.UK, "TYPE: %d, TIME: %d, DATA: %s",
type,
time,
Arrays.toString(data));
showSensorResult(message);
}
}
}
}
Телефон AndroidManifest.xml
:
<service
android:name=".WearableSensorListener"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.google.android.gms.wearable.DATA_CHANGED"/>
<data android:host="*"
android:scheme="wear"
android:pathPrefix="/wearable-sensor"/>
</intent-filter>
</service>
Я вижу журналы с часов, но с телефона ничего не видно.
applicationId
с носимых и телефона одинаковы.
Нужны ли какие-либо дополнительные разрешения для использования API данных?
1 ответ
Использование GooglePlayServices
версия как можно раньше.
открыто.\Sdk\extras\google\m2repository\com\google\android\gms\play-services-wearable\
и использовать, например, 8.3.0
, Посмотрите на версию вашего устройства GooglePlayServices. Его число должно быть больше, чем вы используете.
Я думаю, что вы получили неправильную реализацию. Это не верно.
private void sendSensorResult(SensorEvent event) {
if (!googleApiClient.isConnected())
googleApiClient.connect();
///....
Wearable.DataApi.putDataItem(googleApiClient, request)
Я имею в виду, вы должны ждать соединения. Итак, используйте putDataItem
только после onConnected
Перезвоните.