接触卫士(Contact Shield)是HMS Core提供的基于低功耗蓝牙(Bluetooth Low Energy,简称BLE)的接触诊断基础服务。各国政府组织可以使用接触卫士API开发新冠病毒接触跟踪的应用。在保护用户隐私的基础上,实现和其他手机的互通,帮助用户诊断是否接触了病毒感染者,从而减少新冠病毒的蔓延。
接触卫士的工作原理
1. B的手机会根据每天的周期性密钥(Periodic Key)生成动态共享码(Dynamic Sharing Code,简称DSC)集合,再通过BLE向周围广播DSC。
2. A的手机扫描到B的手机广播的DSC后,记录当前时间戳和蓝牙接收信号强度(Received Signal Strength Indicator,简称RSSI),并将这些数据存储至本地数据库中。
3. 假如B被确诊为COVID-19患者,App获取B的授权后将病毒潜伏期(默认14天)内的周期性密钥上传至App或公共卫生机构指定的服务器。此时,B的周期性密钥称为共享密钥(Shared Key)。
4. A的App定时从服务器下载确诊者的周期性密钥的压缩文件,并调用接触卫士(Contact Shield)进行接触诊断,并根据App提供的共享密钥推导出确诊者曾经广播的DSC集合。
5. 接触诊断过程中,接触卫士使用第4步中生成的DSC集合去匹配本地数据库中曾保存的过去14天的DSC数据表,匹配结束后生成诊断报告,并通过App告知A接触诊断结果。
根据诊断报告,A便可获知曾经是否与确诊者有过密切接触,以及接触的潜在风险等级。
接触卫士在调用接口的过程中会有返回错误码-1的场景,该场景下可能的错误有很多,在这里给大家分享一些该错误码的排查步骤。
注:遇到-1错误码时可以先查看一下报错的日志,然后过滤搜索HmsNearbyKit_sdk_ContactApiImpl关键字,日志中一般都会包含一个真正错误原因的错误码。
1. 没有申请接触卫士权限(错误码6004)
原因1:
与其他HMS SDK不同,接触卫士SDK需要邮件发送相关信息来开通权限。
申请接触卫士API权限可以参考官网文档
原因2:
本地项目中的agconnect-services.json文件不匹配。
需要重新确认下本地项目中添加的agconnect-services.json文件与实际需要的agconnect-services.json文件是不是同一个。
可以去AGC官网上重新下载新的agconnect-services.json文件,然后重新调测。
agconnect-services.json文件下载请参考文档
2. 生成APK的签名文件(.keystore或.jks)与其在AGC上配置的SHA-256信息不一样(错误码6003)
APK签名的文件必须与下方AGC上配置的签名一样才行。
配置步骤可以参考文档
3. 首次调用API时,手机没联网
首次调用接触卫士的API时,如果手机没有连接网络,这种场景下也会返回-1。此场景下,保证网络连接正常后,重新调用接触卫士的API即可。
4.在调用startContactShield()接口后,用户手动取消了弹窗提示
调用startContactShield()接口后,会有如下弹窗,必须选择Allow,才能正常调用接触卫士的API:
注:最新版本的接触卫士中错误码已经更新为8105
5.没有HMS Core APK的定位权限
在调用startContactShield()接口后,除了会弹第4点的弹窗外,如果没有定位权限的话也会弹如下弹窗。同样必须选择“ ALLOW ALL THE TIME” 才能正常调用接触卫士的API。
注:最新版本的接触卫士中错误码已经更新为8103。
该权限的设置可以在 设置-应用-应用管理-搜索HMS Core-权限-位置信息 中查看。
6.调用putSharedKeyFiles接口,提供的文件格式不对
调用接触卫士的putSharedKeyFiles接口时,传入的List<File> files中的文件存在问题。
该文件的格式以及生成方式与谷歌的Exposure Notifications中相关文件的格式和生成方式是一样的。
谷歌相关文档请参考:
https://developers.google.com/android/exposure-notifications/exposure-key-file-format
https://github.com/google/exposure-notifications-server/blob/main/examples/export/README.md
>>访问华为开发者联盟官网,了解更多相关内容
>>获取开发指导文档
>>华为移动服务开源仓库地址:GitHub、Gitee
点击右上角头像右方的关注,第一时间了解华为移动服务最新技术~