
基本概念 HarmonyOS 传感器是应用访问底层硬件传感器的一种设备抽象概念。开发者根据传感器提供的 Sensor API,可以查询设备上的传感器,订阅传感器的数据,并根据传感器数据定制相应的算法,开发各类应用,比如指南针、运动健康、游戏等。 根据传感器的用途,可以将传感器分为六大类:运动类传感器、环境类传感器、方向类传感器、光线类传感器、健康类传感器、其他类传感器(如霍尔传感器),每一大类传感器包含不同类型的传感器,某种类型的传感器可能是单一的物理传感器,也可能是由多个物理传感器复合而成。传感器列表如[图1]所示。 分类 API类名 传感器类型 中文描述 说明 主要用途 运动类 ohos.sensor.agent.CategoryMotionAgent SENSOR_TYPE_ACCELEROMETER 加速度传感器 测量三个物理轴(x、y 和 z)上,施加在设备上的加速度(包括重力加速度),单位 : m/s2 检测运动状态 SENSOR_TYPE_ACCELEROMETER_UNCALIBRATED 未校准加速度传感器 测量三个物理轴(x、y 和 z)上,施加在设备上的未校准的加速度(包括重力加速度),单位 : m/s2 检测加速度偏差估值 SENSOR_TYPE_LINEAR_ACCELERATION 线性加速度传感器 测量三个物理轴(x、y 和 z)上,施加在设备上的线性加速度(不包括重力加速度),单位 : m/s2 检测每个单轴方向上的线性加速度 SENSOR_TYPE_GRAVITY 重力传感器 测量三个物理轴(x、y 和 z)上,施加在设备上的重力加速度,单位 : m/s2 测量重力大小 SENSOR_TYPE_GYROSCOPE 陀螺仪传感器 测量三个物理轴(x、y 和 z)上,设备的旋转角速度,单位 : rad/s 测量旋转的角速度 SENSOR_TYPE_GYROSCOPE_UNCALIBRATED 未校准陀螺仪传感器 测量三个物理轴(x、y 和 z)上,设备的未校准旋转角速度,单位 : rad/s 测量旋转的角速度及偏差估值 SENSOR_TYPE_SIGNIFICANT_MOTION 大幅度动作传感器 测量三个物理轴(x、y 和 z)上,设备是否存在大幅度运动;如果取值为1则代表存在大幅度运动,取值为0则代表没有大幅度运动 用于检测设备是否存在大幅度运动 SENSOR_TYPE_DROP_DETECTION 跌落检测传感器 检测设备的跌落状态;如果取值为1则代表发生跌落,取值为0则代表没有发生跌落 用于检测设备是否发生了跌落 SENSOR_TYPE_PEDOMETER_DETECTION 计步器检测传感器 检测用户的计步动作;如果取值为1则代表用户产生了计步行走的动作;取值为0则代表用户没有发生运动 用于检测用户是否有计步的动作 SENSOR_TYPE_PEDOMETER 计步器传感器 统计用户的行走步数 用于提供用户行走的步数数据 环境类 ohos.sensor.agent.CategoryEnvironmentAgent SENSOR_TYPE_AMBIENT_TEMPERATURE 环境温度传感器 测量环境温度,单位 : 摄氏度 (°C) 测量环境温度 SENSOR_TYPE_MAGNETIC_FIELD 磁场传感器 测量三个物理轴向(x、y、z)上,环境地磁场,单位 : μT 创建指南针 SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED 未校准磁场传感器 测量三个物理轴向(x、y、z)上,未校准环境地磁场,单位 : μT 测量地磁偏差估值 SENSOR_TYPE_HUMIDITY 湿度传感器 测量环境的相对湿度,以百分比 (%) 表示 监测露点、绝对湿度和相对湿度 SENSOR_TYPE_BAROMETER 气压计传感器 测量环境气压,单位 : hPa 或 mbar 测量环境气压 SENSOR_TYPE_SAR 比吸收率传感器 测量比吸收率,单位:W/kg 测量设备的电磁波能量吸收比值。 方向类 ohos.sensor.agent.CategoryOrientationAgent SENSOR_TYPE_6DOF 6自由度传感器 测量上下、前后、左右方向上的位移,单位:m或mm;测量俯仰、偏摆、翻滚的角度,单位:rad 检测设备的三个平移自由度以及旋转自由度,用于目标定位追踪,如:VR SENSOR_TYPE_SCREEN_ROTATION 屏幕旋转传感器 检测设备屏幕的旋转状态 用于检测设备屏幕是否发生了旋转 SENSOR_TYPE_DEVICE_ORIENTATION 设备方向传感器 测量设备的旋转方向,单位:rad 用于检测设备旋转方向的角度值 SENSOR_TYPE_ORIENTATION 方向传感器 测量设备围绕所有三个物理轴(x、y、z)旋转的角度值,单位:rad 用于提供屏幕旋转的3个角度值 SENSOR_TYPE_ROTATION_VECTOR 旋转矢量传感器 测量设备旋转矢量,复合传感器:由加速度传感器、磁场传感器、陀螺仪传感器合成 检测设备相对于东北天坐标系的方向 SENSOR_TYPE_GAME_ROTATION_VECTOR 游戏旋转矢量传感器 测量设备游戏旋转矢量,复合传感器:由加速度传感器、陀螺仪传感器合成 应用于游戏场景 SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR 地磁旋转矢量传感器 测量设备地磁旋转矢量,复合传感器:由加速度传感器、磁场传感器合成 用于测量地磁旋转矢量 光线类 ohos.sensor.agent.CategoryLightAgent SENSOR_TYPE_PROXIMITY 接近光传感器 测量可见物体相对于设备显示屏的接近或远离状态 通话中设备相对人的位置 SENSOR_TYPE_TOF ToF传感器 测量光在介质中行进一段距离所需的时间 人脸识别...

场景介绍 应用可以通过观察蜂窝网络状态变化,来接收最新蜂窝网络服务状态信息、信号信息等。 接口说明 RadioStateObserver 类中提供了观察蜂窝网络状态变化的方法,为了能够实时观察蜂窝网络状态变化,应用必须包含以下权限。 观察状态名称 权限名称 网络状态信息(NETWORK_STATE) ohos.permission.GET_NETWORK_INFO 信号信息(SIGNAL_INFO) NA 需要使用 RadioInfoManager 的如下接口将继承 RadioStateObserver 类的对象注册到系统服务: 接口名 观察事件的掩码 描述 addObserver OBSERVE_MASK_NETWORK_STATE 观察蜂窝网络驻网状态信息。 OBSERVE_MASK_SIGNAL_INFO 观察蜂窝网络信号信息。 removeObserver N/A 停止观察所有状态的变化。 开发步骤 添加观察事件 调用 RadioInfoManager 的 getInstance 接口,获取到 RadioInfoManager 实例。 创建继承 RadioStateObserver 的类 MyRadioStateObserver,并覆写状态变化回调方法。 创建 MyRadioStateObserver 的对象 observer。 调用 RadioInfoManager 的 addObserver 方法,传入已创建的 MyRadioStateObserver 对象 observer 和需要观察的 mask。 // 获取RadioInfoManager对象。 RadioInfoManager radioInfoManager = RadioInfoManager.getInstance(context); // 创建继承RadioStateObserver的类MyRadioStateObserver class MyRadioStateObserver extends RadioStateObserver { // 构造方法,在当前线程的runner中执行回调,slotId需要传入要观察的卡槽ID(0或1)。 MyRadioStateObserver(int slotId) { super(slotId); } // 构造方法,在执行runner中执行回调。 MyRadioStateObserver(int slotId, EventRunner runner) { super(slotId, runner); } // 网络注册状态变化的回调方法。 @Override public void onNetworkStateUpdated(NetworkState state) { ... } // 信号信息变化的回调方法。 @Override public void onSignalInfoUpdated(List<SignalInformation> signalInfos) { ... } } // 执行回调的runner。 EventRunner runner = EventRunner.create(); // 创建MyRadioStateObserver的对象。 MyRadioStateObserver observer = new MyRadioStateObserver(slotId, runner); //...

场景介绍 应用通常需要获取用户所在蜂窝网络下信号信息,以便获取当前驻网质量。开发者可以通过本业务,获取到用户指定 SIM 卡当前所在网络下的信号信息。 接口说明 RadioInfoManager 类中提供了获取当前网络信号信息列表的方法。 功能分类 接口名 描述 所需权限 获取管理对象 getInstance(Context context) 获取网络管理对象。 无 信号强度信息 getSignalInfoList(int slotId) 获取当前注册蜂窝网络信号强度信息。 无 开发步骤 调用 RadioInfoManager 的 getInstance 接口,获取到 RadioInfoManager 实例。 调用 getSignalInfoList(slotId) 方法,返回所有 SignalInformation 列表。 遍历 SignalInformation 列表,并分别根据 signalNetworkType 转换为对应制式的 SignalInformation 子类对象。 调用子类中的方法,获取信号强度信息。 // 获取RadioInfoManager对象。 RadioInfoManager radioInfoManager = RadioInfoManager.getInstance(context); // 获取信号信息。 List<SignalInformation> signalList = radioInfoManager.getSignalInfoList(slotId); // 检查信号信息列表大小。 if (signalList.size() == 0) { return; } // 依次遍历list获取当前驻网networkType对应的信号信息。 LteSignalInformation lteSignal; for (SignalInformation signal : signalList) { int signalNetworkType = signal.getSignalNetworkType(); if (signalNetworkType == TelephonyConstants.NETWORK_TYPE_LTE) { lteSignal = (LteSignalInformation) signal; } } // 调用子类中相应方法,获取对应制式的信号强度信息。 int signalLevel = lteSignal.getSignalLevel();

场景介绍 应用需要发送一条短信给一个指定的号码时,使用本业务。发送信息需要经过短信中心,短信中心号码可以是运营商默认的,也可以由应用自己指定。 如果设备支持同时插入 2 张 SIM 卡,且 2 张 SIM 卡均在位时,短信会从默认 SIM 卡发出。应用可通过调用 getDefaultSmsSlotId 来获取当前发短信的默认 SIM 卡位置。目前 API 暂不支持短信发送结果通知和送达报告。 接口说明 ShortMessageManager 为开发者提供短信管理功能,具体功能分类如下表。 功能分类 接口名 描述 所需权限 能力获取 hasSmsCapability() 检查当前设备是否支持短信收发。 无 获取管理对象 getInstance(Context context) 获取短信管理对象。 无 获取默认短信卡 getDefaultSmsSlotId() 获取默认短信卡对应卡槽ID。 无 长短信转化 splitMessage(String content) 将超过140个字节的长短信(如中文70个字符,英文160个字符)拆分成多条短信。 ohos.permission.SEND_MESSAGES 发送短信 sendMessage(String destinationHost, String serviceCenter, String content) 发送单条短信。 ohos.permission.SEND_MESSAGES sendMultipartMessage(String destinationHost, String serviceCenter, ArrayList<String> parts) 发送拆分后的多条短信。 ohos.permission.SEND_MESSAGES 开发步骤 调用 ShortMessageManager 的 getInstance 接口,创建/获取短信收发管理对象。 调用 hasSmsCapability() 接口获取当前设备短信收发能力,如果支持继续下一步;如果不支持则无法收发短信。 发送短信。 // 创建短信收发管理对象 ShortMessageManager smManager = ShortMessageManager.getInstance(context); // 检查短信能力 if (!smManager.hasSmsCapability()) { return; } // 如果设备支持收发短信,则继续发送短信 // 发送短信前可先调用splitMessage()接口判断拆分后的短信条数,然后决定调用长短信或普通短信发送接口 ArrayList<String> msgs = smManager.splitMessage(messageContent); if (msgs.size() > 1) { // 长短信拆分发送 smManager.sendMultipartMessage(destinationNumber, serviceCenter, msgs); } else { // 一般文本短信发送 smManager.sendMessage(destinationNumber, serviceCenter, messageContent); }

场景介绍 当应用需要发起一路呼叫给一个指定的号码时,使用本业务。呼叫可以是音频呼叫,也可以是视频呼叫。 如果设备支持同时插入两张 SIM 卡,且拨打电话时两张SIM 卡均在位,呼叫时会弹出弹框让用户选择从卡 1 还是卡 2 呼出。 接口说明 DistributedCallManager 为开发者提供呼叫管理功能,具体功能分类如下表。 功能分类 接口名 描述 所需权限 能力获取 hasVoiceCapability() 检查当前设备是否支持语音呼叫。 无 获取管理对象 getInstance(Context context) 获取呼叫管理对象。 无 发起呼叫 dial(String number, boolean isVideoCall) 发起音频或视频呼叫。 ohos.permission.PLACE_CALL 观察通话业务状态变化 addObserver(CallStateObserver observer, int mask) 观察通话业务状态变化。 ohos.permission.READ_CALL_LOG(获取通话号码需要该权限) 开发步骤 调用 DistributedCallManager 的 getInstance 接口,创建/获取呼叫管理对象。 调用 hasVoiceCapability() 接口获取当前设备呼叫能力,如果支持继续下一步;如果不支持则无法发起呼叫。 发起一路呼叫。 注册观察呼叫状态变化。 // 创建呼叫管理对象 DistributedCallManager dcManager = DistributedCallManager.getInstance(context); // 调用查询能力接口 if (!dcManager.hasVoiceCapability()) { return; } // 如果设备支持呼叫能力,则继续发起呼叫 dcManager.dial(destinationNum, isVideoCall); // 创建继承CallStateObserver的类MyCallStateObserver class MyCallStateObserver extends CallStateObserver { // 构造方法,在当前线程的runner中执行回调,slotId需要传入要观察的卡槽ID(0或1) MyCallStateObserver(int slotId) { super(slotId); } // 构造方法,在执行runner中执行回调,slotId需要传入要观察的卡槽ID(0或1) MyCallStateObserver(int slotId, EventRunner runner) { super(slotId, runner); } // 通话状态变化的回调方法 @Override public void onCallStateUpdated(int state, String number) { ... } } // 执行回调的runner EventRunner runner = EventRunner.create(); // 创建MyCallStateObserver的对象 MyCallStateObserver observer = new MyCallStateObserver(slotId, runner); // 观察OBSERVE_CALL_STATE的变化 dcManager.addObserver(observer, CallStateObserver.OBSERVE_CALL_STATE);

电话服务系统,除了为用户提供拨打语音/视频呼叫以及发送标准短信的功能以外,还提供了一系列的 API 用于获取无线蜂窝网络和 SIM 卡相关的一些信息。 其中拨打电话相关功能由 DistributedCallManager 提供,短信服务能力由 ShortMessageManager 提供。 应用还可以通过调用 RadioInfoManager 中的 API,来获取当前注册网络名称、网络服务状态以及信号强度等信息;以及调用 SimInfoManager 中的 API,来获取 SIM 卡的相关信息。 约束与限制 部分 API 接口需要一定访问权限才能调用,因此三方应用在调用有权限控制的API时,需要先申请对应权限,权限申请详见权限章节。 语音呼叫和短信功能暂不支持传入卡槽编号(SlotId),双卡场景下的使用规则详见发起一路呼叫和发送一条文本信息的场景介绍。 注册获取 SIM 卡状态接口仅针对有 SIM 卡在位场景生效,若用户拔出 SIM 卡,则接收不到回调事件。应用可通过调用 hasSimCard 接口来确定当前卡槽是否有卡在位。

场景介绍 应用重复打开一个相同网页时,可以优先从缓存文件里读取内容,从而减少数据流量,降低设备功耗,提升应用性能。 接口说明 管理 HTTP 缓存的功能主要由 HttpResponseCache 类提供。 接口名 功能描述 install(File directory, long size) 使能 HTTP 缓存,设置缓存保存目录及大小。 getInstalled() 获取缓存实例。 flush() 立即保存缓存信息到文件系统中。 close() 关闭缓存功能。 delete() 关闭并清除缓存内容。 开发步骤 配置缓存目录及最大缓存空间。 保存缓存。 关闭缓存。 // 初始化时设置缓存目录dir及最大缓存空间 HttpResponseCache.install(dir, 10 * 1024 * 1024); // 访问URL // 为确保缓存保存到文件系统可以执行flush操作 HttpResponseCache.getInstalled().flush(); // 结束时关闭缓存 HttpResponseCache.getInstalled().close();

场景介绍 应用通过调用 API 接口,可以获取蜂窝网络、所有网卡、指定应用或指定网卡的数据流量统计值。 接口说明 应用进行流量统计,所使用的接口主要由 DataFlowStatistics 提供。 接口名 功能描述 getCellularRxBytes() 获取蜂窝数据网络的下行流量。 getCellularTxBytes() 获取蜂窝数据网络的上行流量。 getAllRxBytes() 获取所有网卡的下行流量。 getAllTxBytes() 获取所有网卡的上行流量。 getUidRxBytes(int uid) 获取指定UID的下行流量。 getUidTxBytes(int uid) 获取指定UID的上行流量。 getIfaceRxBytes(String nic) 获取指定网卡的下行流量。 getIfaceTxBytes(String nic) 获取指定网卡的上行流量。 开发步骤 调用 DataFlowStatistics 的接口可进行流量统计,以统计指定应用进程的流量为例。 long rx = DataFlowStatistics.getUidRxBytes(uid); long tx = DataFlowStatistics.getUidTxBytes(uid); // 进行数据收发 // 统计流量 rx = DataFlowStatistics.getUidRxBytes(uid) - rx; tx = DataFlowStatistics.getUidTxBytes(uid) - tx;

场景介绍 应用可以调用 API 接口来使用指定网络进行数据传输。在进行数据传输前,需要先建立自定义的网络类型。 接口说明 应用使用指定网络进行数据访问,所使用的接口说明如下。 类名 接口名 功能描述 NetSpecifier Builder() 创建一个指定网络实例。 NetManager setupSpecificNet(NetSpecifier netSpecifier, NetStatusCallback callback) 建立指定的数据网络。 removeNetStatusCallback(NetStatusCallback callback) 停止获取数据网络状态。 开发步骤 调用 NetSpecifier.Builder( )构建指定数据网络的实例。 调用 NetManager.setupSpecificNet() 建立数据网络,通过 callback 获取网络状态变化。 进行数据发送。 NetManager netManager = NetManager.getInstance(null); private class MmsCallback extends NetStatusCallback { @Override public void onAvailable(NetHandle netHandle) { // 通过setAppNet把后续应用所有的请求都通过该网络进行发送 netManager.setAppNet(netHandle); try { HttpURLConnection connection = null; String urlString = "https://www.huawei.com/"; URL url = new URL(urlString); URLConnection urlConnection = netHandle.openConnection(url, java.net.Proxy.NO_PROXY); if (urlConnection instanceof HttpURLConnection) { connection = (HttpURLConnection) urlConnection; } connection.setRequestMethod("GET"); connection.connect(); // 之后可进行url的其他操作 } finally { connection.disconnect(); } // 如果业务执行完毕,可以停止获取 netManager.removeNetStatusCallback(this); } } MmsCallback callback = new MmsCallback(); // 配置一个彩信类型的蜂窝网络 NetSpecifier req = new NetSpecifier.Builder() .addCapability(NetCapabilities.NET_CAPABILITY_MMS) .addBearer(NetCapabilities.BEARER_CELLULAR) .build(); // 建立数据网络,通过callback获取网络变更状态 netManager.setupSpecificNet(req, callback);

场景介绍 应用使用当前的数据网络进行 Socket 数据传输。 接口说明 应用使用当前网络进行 Socket 数据传输,所使用的接口说明如下。 类名 接口名 功能描述 NetManager getByName(String host) 解析主机名,获取其 IP 地址。 bindSocket(Socket socket) 绑定 Socket 到该数据网络。 NetHandle bindSocket(DatagramSocket socket) 绑定 DatagramSocket 到该数据网络。 开发步骤 调用 NetManager.getInstance(Context) 获取网络管理的实例对象。 调用 NetManager.getDefaultNet() 获取默认的数据网络。 调用 NetHandle.bindSocket() 绑定网络。 使用 socket 发送数据。 NetManager netManager = NetManager.getInstance(null); if (!netManager.hasDefaultNet()) { return; } NetHandle netHandle = netManager.getDefaultNet(); // 通过Socket绑定来进行数据传输 try { InetAddress address = netHandle.getByName("www.huawei.com"); DatagramSocket socket = new DatagramSocket(); netHandle.bindSocket(socket); byte[] buffer = new byte[1024]; DatagramPacket request = new DatagramPacket(buffer, buffer.length, address, port); // buffer赋值 // 发送数据 socket.send(request); } catch(IOException e) { e.printStackTrace(); }