Wearable DataClient onDataChanged 永远不会被调用

问题描述 投票:0回答:2

我正在构建一个 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!");
        }
    });
}

这是穿戴端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 上进行了很多更改,因此许多有关此的信息已变得无关紧要。谢谢!

android wear-os google-datalayer dataitem
2个回答
1
投票

找到了!问题在于手表应用程序没有使用与手持应用程序相同的密钥进行签名。我这样做之后,立马见效了!


0
投票

解决步骤

1)包名一致性:

  • 确保穿戴式和手持式设备模块均具有 相同的包名。虽然它可能适用于不同的包名称, 最好保持它们相同以避免潜在的冲突。

2)清单中的权限:

  • 检查您的文件中是否声明了所有必要的权限 AndroidManifest.xml 文件。

3)网络连接:

  • 确认手持设备和穿戴设备均已连接 同一网络。

4)签名密钥匹配:

  • 验证两者的 SHA-1、MD5 和 SHA-256 密钥是否相同 模块。不匹配可能会阻止检测到数据更改。

  • 要检查并确保密钥匹配,请按照本视频中的步骤操作:

生成SHA1密钥

5)更新build.gradle(手持模块):

  • 在手持设备模块的build.gradle中添加以下内容 线路:
android {
    signingConfigs {
        debug {
            storeFile file('debug.keystore')
            storePassword 'android'
            keyAlias 'androiddebugkey'
            keyPassword 'android'
        }
    }
    buildTypes {
        debug {
            signingConfig signingConfigs.debug
        }
    }
}

6)更新build.gradle(WearOS模块):

  • 同样,在wear模块的build.gradle中,添加相同的行:
android {
    signingConfigs {
        debug {
            storeFile file('debug.keystore')
            storePassword 'android'
            keyAlias 'androiddebugkey'
            keyPassword 'android'
        }
    }
    buildTypes {
        debug {
            signingConfig signingConfigs.debug
        }
    }
}

注意:这可能会导致有关找不到 debug.keystore 文件的错误。

7) 将 debug.keystore 复制到穿戴模块:

  • 在手持设备模块中找到 debug.keystore 文件(通常是 在 android -> 应用程序)中。

  • 复制 debug.keystore 文件并将其粘贴到 WearOS 模块中。

8)生成匹配密钥:

  • 再次按照该视频中的步骤生成匹配密钥 两个模块:

生成SHA1密钥

9)重新启动Android Studio和IDE:

  • 完成上述步骤后,重新启动Android Studio和您的 React Native IDE。

10) 测试和验证:

  • 再次运行您的应用程序,您现在应该看到数据 可穿戴设备和手持设备之间同步 onDataChanged 方法工作正常。
© www.soinside.com 2019 - 2024. All rights reserved.