0

反応ネイティブ プロジェクトの一部として、wear os アプリを構築しています。ハンドヘルド アプリケーションは、変更されるたびにウェアラブル ノード間で何らかのデータを送信する必要があります。これを行うために 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!");
        }
    });
}

これは、ウェアラブル側の DataClient の onDataChanged メソッドです。

@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 が呼び出されることはなく、問題が見つかりません。私はいくつかのことを試しました。

  • パッケージ名とアプリケーションIDが同じ
  • (ご覧のとおり)タイムスタンプを追加したので、DataItemは毎回本当に異なります
  • ハンドヘルド側では、NodeClient を使用して接続されたノードを一覧表示するメソッドを実装しました。スマートウォッチは常に接続ノードとしてリストされます。
  • DataLayerListeningService も実装しようとしましたが、これも起動しません。私が推測する同じ問題。

Google が DataLayer API を大幅に変更したため、これに関する多くの情報が不要になりました。ありがとう!

4

1 に答える 1

1

それを見つけた!問題は、watch アプリケーションがハンドヘルド アプリと同じキーで署名されていなかったことです。私がこれをした後、すぐにうまくいきました!

于 2020-06-18T12:28:57.030 に答える