Я создаю приложение Wear OS как часть проекта React Native. Портативное приложение должно отправлять некоторые данные между своими носимыми узлами при каждом изменении. Для этого я использую DataClient и DataItems. На носимой стороне я реализовал DataClient.OnDataChangedListener, но он никогда не вызывается.
Это метод, который вызывается при изменении данных. Я получаю сообщение onSucces, поэтому предполагаю, что это работает:
@ReactMethod
public void updateData(String name, Integer age, String description){
PutDataMapRequest putDataMapReq = PutDataMapRequest.create("/data");
Long tsLong = System.currentTimeMillis() / 1000;
String timestamp = tsLong.toString();
putDataMapReq.getDataMap().putString("Timestamp", timestamp);
putDataMapReq.getDataMap().putString("Name", name);
putDataMapReq.getDataMap().putInt("Age", age);
putDataMapReq.getDataMap().putString("Description", description);
PutDataRequest dataRequest = putDataMapReq.asPutDataRequest();
dataRequest.setUrgent();
Task<DataItem> putDataTask = Wearable.getDataClient(reactContext).putDataItem(dataRequest);
putDataTask.addOnSuccessListener(new OnSuccessListener<DataItem>() {
@Override
public void onSuccess(DataItem dataItem) {
System.out.println("Great Succes!");
}
});
}
Это метод onDataChanged DataClient на носимой стороне.
@Override
public void onDataChanged(DataEventBuffer dataEventBuffer) {
System.out.println("DATA CHANGED");
for (DataEvent event : dataEventBuffer) {
if (event.getType() == DataEvent.TYPE_CHANGED) {
// DataItem changed
DataItem item = event.getDataItem();
if (item.getUri().getPath().compareTo("/data") == 0) {
DataMap dataMap = DataMapItem.fromDataItem(item).getDataMap();
System.out.println(dataMap.getString("Name"));
}
} else if (event.getType() == DataEvent.TYPE_DELETED) {
// DataItem deleted
}
}
}
Это зависимости в файлах gradle для портативного устройства:
dependencies {
implementation project(':react-native-background-timer')
implementation project(':react-native-geolocation-service')
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation "com.facebook.react:react-native:+"
implementation 'com.google.android.gms:play-services-wearable:17.0.0'
if (enableHermes) {
def hermesPath = "../../node_modules/hermes-engine/android/";
debugImplementation files(hermesPath + "hermes-debug.aar")
releaseImplementation files(hermesPath + "hermes-release.aar")
} else {
implementation jscFlavor
}
wearApp project(':watch')
}
И зависимости в файлах gradle для носимых устройств:
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.wear:wear:1.0.0'
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'androidx.percentlayout:percentlayout:1.0.0'
implementation 'androidx.legacy:legacy-support-v13:1.0.0'
implementation 'com.google.android.gms:play-services-wearable:17.0.0'
compileOnly 'com.google.android.wearable:wearable:2.7.0'
implementation 'com.google.android.support:wearable:2.7.0'
}
Опять же, onDataChanged никогда не вызывается, и я не могу найти проблему. Я пробовал несколько вещей.
- Имя пакета и идентификатор приложения одинаковы
- Я добавил метку времени (как вы можете видеть), поэтому DataItem каждый раз действительно отличается
- На портативной стороне я реализовал метод, который выводит список подключенных узлов с помощью NodeClient. Умные часы всегда указаны как подключенный узел '
- . Я также пытался реализовать DataLayerListeningService, но это тоже не срабатывает. Думаю, та же проблема.
Поскольку Google сильно изменил свой DataLayer API, большая часть информации об этом стала неактуальной. Спасибо!