# Watch Connect APP **Repository Path**: gorit/watch-connect-app ## Basic Information - **Project Name**: Watch Connect APP - **Description**: 提供给行业伙伴的demo应用, 可实现与穿戴互联 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 5 - **Created**: 2024-12-16 - **Last Updated**: 2025-10-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # watch-connect-app开发流程 watch-connect-app的开发主要是实现watch-connect-kit的服务端功能,给集成kit的三方应用提供服务。 ## 1.demo开发环境 Android Studio: 2024.1.1 Patch 1。 Android SDK: 35。 Android Gradle Plugin Version: 8.5.0。 Gradle Version: 8.7。 Java Version: 1.8 ## 2.watch-connect-kit服务端开发 ### 2.1.引入aidl以及相关结构体等定义 在Openharmony Watch社区,已经提供了aidl接口,以及相关结构体的定义。aidl接口定义:[点我查看](https://gitee.com/cooperation-team-L0UI/doc/tree/master/%E6%89%8B%E6%9C%BA%E6%89%8B%E8%A1%A8%E4%BA%92%E8%81%94%E5%BC%80%E5%8F%91/phone)。 目前有 **aidl源代码** 和 **aar库** 两种集成方式,推荐使用 **aar库** 集成方式。 ### 2.2.aidl源代码集成 2.2.1.工程main目录下新建 `aidl` 文件夹,与 `java` 目录在同一层级,将定义好的aidl文件拷贝进来。 2.2.2.将定义好结构体的java文件拷贝到 `java` 目录下。 demo中目录结构如下图: ![](assets/1.png) 2.2.3.在Android Studio中菜单栏中的 `Build` 项,选择 `Make Project` 或 `Make Module` 对应的module,会自动将aidl生成为java接口文件,主要是生成binder通讯相关,生成的临时文件在项目的 `build\generated\aidl_source_output_dir\debug\out\com\openharmony\watch\aidl` 下。 **注意:** 1. `aidl` 中使用了对应的 `结构体`,`aidl` 和 `结构体` 的包名必须一致,不然编译会报错。 2. 不要修改 `aidl` 和 `结构体` 的定义,避免出现三方应用集成的kit与实现的kit接口等定义不一致,出现功能无法使用,导致兼容性问题。 ### 2.3.aar库集成(推荐) 2.3.1.Openharmony Watch 社区有提供已经编译好的aar库,可以直接下载,aar下载地址:[点我下载](https://gitee.com/cooperation-team-L0UI/watch-connect-kit/tree/master/kit)。 2.3.2.在工程module `app` 目录下新建 **libs** 目录,将下载好的 **watch-connect-kit.aar** 拷贝进来。 ![](assets/3.png) 2.3.3.在工程module `app` 下面的 **build.gradle** 添加 **watch-connect-kit.aar** 库依赖。 ```gradle dependencies { ...... implementation files('libs/watch-connect-kit.aar') ...... } ``` 2.3.4.在Android Studio中菜单栏中的 `Build` 项,选择 `Make Project` 或 `Make Module` 对应的module,编译完成后,可以在 `External Libraries` 中查看接口及结构体等定义。 ![](assets/4.png) ### 2.4.aidl等接口实现 在aidl中主要涉及3个接口:DeviceClient,P2pClient,NotifyClient。以 `DeviceClient` 为例。 2.4.1.在 `app\src\main\java\com\demo\watchconnectapp\binder\DeviceClientBinder.java` 文件中,继承 `DeviceClient.Stub` 实现 `DeviceClient` 中的 `getBondedDevices` 接口。 2.4.2.`getBondedDevices` 作用是获取与App已配对的设备列表,获取到之后通过 `DeviceCallback` 回调给调用端。 ```java public class DeviceClientBinder extends DeviceClient.Stub { private static final String TAG = "test-watchConnectApp"; @Override public void getBondedDevices(DeviceCallback callback) throws RemoteException { Log.i(TAG, "DeviceClientBinder::getBondedDevices"); if (callback != null) { List devices = new ArrayList<>(); // 模拟获取设备 devices.add(new Device("W6688", "Wear6688", "6666-8888-9999-2222", 0, "", "1.0.0.1", true, 1, 1, 1, 0)); devices.add(new Device("W6699", "Wear6699", "6666-9999-8888-3333", 0, "", "3.0.1.11", false, 1, 1, 1, 0)); // 将结果回调给调用端 callback.onGetResult(devices); } } } ``` 2.4.3.其它的 `NotifyClient` 和 `P2pClient` 可以参考 `DeviceClient` 实现对应的 `binder`。 ![](assets/2.png) 2.4.4.在 `com/demo/watchconnectapp/service/KitService.java` 文件中,定义 `KitService` 继承 `Service` ,在内部定义 `BinderFactory` 类继承 `IBinderFactory` ,实现 `generateBinder` ,根据不同的 `type` 返回指定的 `binder`。 ```java public class KitService extends Service { private static final String TAG = "test-watchConnectApp"; @Nullable @Override public IBinder onBind(Intent intent) { Log.i(TAG, "KitService::onBind"); return new BinderFactory(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i(TAG, "KitService::onStartCommand"); return START_STICKY; } class BinderFactory extends IBinderFactory.Stub { @Override public IBinder generateBinder(int binderType) { Log.i(TAG, "KitService::BinderFactory::generateBinder, binderType:" + binderType); IBinder binder; switch (binderType) { case IBinderFactory.DEVICE_CLIENT: binder = new DeviceClientBinder(); break; case IBinderFactory.P2P_CLIENT: binder = new P2pClientBinder(); break; case IBinderFactory.NOTIFY_CLIENT: binder = new NotifyClientBinder(); break; default: Log.e(TAG, "KitService::BinderFactory::generateBinder, invalid binderType!!"); binder = null; } return binder; } } } ``` 2.4.5.在 `AndroidManifest.xml` 文件中,在 `application` 标签下,添加刚刚实现的 `KitService` ,代码如下: ```html ``` **需要注意的是**: 1. 服务需要给三方应用调用, **android:exported** 属性必须配置为 **true** 。 2. 服务的 **action** 必须为 **OH_WATCH_CONNECT_ACTION** ,否则会导致查询不到服务,无法通讯。 2.4.6.在其它接口中,还需要用到读写文件的权限,还需在 `AndroidManifest.xml` 文件中, `manifest` 标签下添加读写文件的权限。 ```html ``` 2.4.7.在 `application` 标签内,添加 `android:requestLegacyExternalStorage="true"` 。 2.4.8.在 `java/com/demo/watchconnectapp/activity/MainActivity.java` 中,目前是在 `onCreate` 中启动 `KitService` 。 ```java Intent intent = new Intent(MainActivity.this, KitService.class); ComponentName name = startService(intent); if (name != null) { Log.i(TAG, "onCreate: startService success." + name); } else { Log.e(TAG, "onCreate: startService failed."); } ``` **建议**:将 `KitService` 设置为常驻。 2.4.9.在 `onCreate` 中,将需要的权限动态申请下。 ```java public void initPermissions() { EasyPermissions.requestPermissions(this, "开始授权获取[媒体和文件]权限", RC_PERMISSIONS, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults, int deviceId) { super.onRequestPermissionsResult(requestCode, permissions, grantResults, deviceId); EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this); } @Override public void onPermissionsGranted(int requestCode, @NonNull List perms) { Log.d(TAG, "All permissions granted !!"); } @Override public void onPermissionsDenied(int requestCode, @NonNull List perms) { Log.d(TAG, "PermissionsDenied:" + perms); Toast.makeText(this, "有应用必须的权限被拒绝,会导致功能报错或退出,请前往[设置]->[应用和服务]->[权限管理]中授权", Toast.LENGTH_SHORT).show(); } ``` **建议**:在需要使用权限的操作前,先检测下是否有权限,建议使用 `EasyPermissions`,`RxPermissions` 等权限管理工具。 ## 3.注意事项 ### 3.1.aidl开发问题 在实现aidl接口时,注意不要改动接口定义或是结构体定义,避免与集成的kit不一致,功能无法调用,以及出现的兼容性问题。 ### 3.2.代码开发 需要实现以下几个文件,替换掉 `Demo` 中的代码: ```bash java/com/demo/watchconnectapp/binder/DeviceClientBinder.java java/com/demo/watchconnectapp/binder/NotifyClientBinder.java java/com/demo/watchconnectapp/binder/P2pClientBinder.java java/com/demo/watchconnectapp/service/KitService.java ``` ### 3.3.权限问题 开发会需要存储,网络,蓝牙等权限,在 `AndroidManifest.xml` 中申明,在需要权限的操作前,最好动态检查和申请,建议使用 `EasyPermissions`,`RxPermissions` 等权限管理工具。 ### 3.4.线程问题 执行长时任务时,不要在UI线程执行,建议使用RxAndroid等库来调度线程的切换。 ### 3.5.服务导出 在自定义服务中,需要将 `exported` 配置为 `true` , 服务的 `ACTION` 必须为 `OH_WATCH_CONNECT_ACTION` 。