HarmonyOS 接入指南
原ICDevice因iOS会提示重名,为避免编译报错,后续所有系统的SDK版本将ICDevice更改为ICMDevice
SDK支持平台
因HarmonyOS NEXT还没正式发布,目前测试的机型只有Mate 60 Pro,系统版本HarmonyOS NEXT Developer Preveiew2.
SDK基于这个版本的API进行开发。
权限
动态申请: ohos.permission.ACCESS_BLUETOOTH
代码示例
这个仅是示例,实际申请请按自己的开发情况来。但需要注意,SDK初始化一定是在拥有蓝牙权限以后。
private permissions: Array<Permissions> = ['ohos.permission.ACCESS_BLUETOOTH'];
private DOMAIN_NUMBER: number = 0xFF00;
// 调用申请蓝牙权限和初始化SDK
initSDK(): void
{
let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
let grantStatus: abilityAccessCtrl.GrantStatus = abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;
// 获取应用程序的accessTokenID
let tokenId: number = 0;
try {
bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION).then((bundleInfo) => {
let appInfo: bundleManager.ApplicationInfo = bundleInfo.appInfo;
tokenId = appInfo.accessTokenId;
// 检查是否拥有蓝牙权限
atManager.checkAccessToken(tokenId, this.permissions[0]).then(status => {
if (status == abilityAccessCtrl.GrantStatus.PERMISSION_DENIED) {
// 没有权限就申请
atManager.requestPermissionsFromUser(this.context, this.permissions, (err, permissons) => {
if (permissons.authResults[0] == abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
// 申请权限后,初始化SDK
let config = new ICDeviceManagerConfig();
config.context = this.context.getApplicationContext();
ICDeviceManager.shared().setDelegate(this);
ICDeviceManager.shared().initMgrWithConfig(config);
}
else {
hilog.error(1, "DEMO", "no ble permission");
}
})
}
else {
// 已经拥有权限,初始化SDK
let config = new ICDeviceManagerConfig();
config.context = this.context.getApplicationContext();
ICDeviceManager.shared().setDelegate(this);
ICDeviceManager.shared().initMgrWithConfig(config);
}
});
});
} catch (error) {
const err: BusinessError = error as BusinessError;
console.error(`Failed to get bundle info for self. Code is ${err.code}, message is ${err.message}`);
}
}
导入SDK
SDK使用TypeScript与C++混合开发,提供har包进行导入.
因导入方式有多种,这里仅列出其中一种,导入步骤如下:
SDK接入流程
初始化SDK
注意:请获取到蓝牙权限以后,再去初始化SDK.
调用ICDeviceManager.shared().initMgrWithConfig(cfg)
进行初始化SDK,在初始化之前,建议调用ICDeviceManager.shared().setDelegate(delegate)
设置好代理对象。否则可能会丢失部分回调。如:
let config = new ICDeviceManagerConfig();
config.context = this.context.getApplicationContext();
ICDeviceManager.shared().setDelegate(this);
ICDeviceManager.shared().initMgrWithConfig(cfg);
扫描设备
SDK初始化完成后,如果需要查找附近的设备,可以调用扫描接口来进行扫描设备:
ICDeviceManager.shared().scanDevice(delegate);
设备将通过扫描回调代理对象进行回调(调用扫描接口前,请确保蓝牙是否开启,否则该接口不会生效,如正常扫描过程中关闭蓝牙,然后再次打开蓝牙,请重新调用该接口,SDK不会自动去开启扫描).
注: 如果已知道设备的mac地址,可以直接调用添加设备接口,不用调用扫描接口。SDK内部会自动去连接这个设备。
停止扫描
调用了扫描设备接口,在已经找到需要的设备后,请调用停止扫描(sdk不会自动停止):
ICDeviceManager.shared().stopScan();
添加设备
如果已经找到需要的设备了,调用添加设备接口:
ICDeviceManager.shared().addDevice(device,addCallback);
接口可以时SDK去连接设备并收取数据(请确保设备处于亮屏状态,否则SDK将会不会收到数据, 中途蓝牙关闭或设备息屏,当蓝牙重新开启或设备再次亮屏,SDK会自动去连接,无需再次添加设备或扫描设备).
删除设备
当不想SDK去连接和收取设备数据时,从SDK移除该设备,可以调用移除设备接口:
ICDeviceManager.shared().removeDevice(device,removeCallback);
更新用户信息
因为要计算用户的体脂以及一些其他数据,所以需要App调用更新用户信息接口:
ICDeviceManager.shared().updateUserInfo(userInfo);
设备设置接口
部分设备支持设置单位或卡路里等属性,获取这些设置接口:
ICDeviceManager.shared().getSettingManager();
体脂算法接口
获取体脂算法接口:
ICDeviceManager.shared().getBodyFatAlgorithmsManager();