1# 状态注册<a name="ZH-CN_TOPIC_0000001152064139"></a>
2
3-   [简介](#section117mcpsimp)
4-   [目录](#section124mcpsimp)
5-   [约束](#section128mcpsimp)
6-   [说明](#section134mcpsimp)
7    -   [接口说明](#section136mcpsimp)
8
9-   [使用说明](#section163mcpsimp)
10    -   [订阅接口参数说明](#section1099113151207)
11    -   [接口调用代码示例](#section1558565082915)
12
13-   [相关仓](#section206mcpsimp)
14
15## 简介<a name="section117mcpsimp"></a>
16
17状态注册主要负责提供电话服务子系统各种消息事件的订阅以及取消订阅的API。事件类型包括网络状态变化、信号强度变化、小区信息变化、蜂窝数据连接状态变化、通话状态变化等等。
18
19**图 1**  状态注册架构图<a name="fig13267152558"></a>
20![](figures/状态注册-架构图.png)
21
22## 目录<a name="section124mcpsimp"></a>
23
24```
25/base/telephony/state_registry      # 状态注册转发服务
26├─ figures                          # Readme资源文件
27├─ frameworks                       # 框架层目录
28│  ├─ js                            # js相关代码
29│  └─ native                        # native相关代码
30├─ interfaces                       # 接口目录
31│  ├─ innerkits                     # 部件间的内部接口
32│  └─ kits                          # 对应用提供的接口(例如JS接口)
33├─ sa_profile                       # 启动配置文件
34├─ services                         # 服务内部代码
35└─ test                             # 测试相关
36   ├─ mock                          # 模拟测试相关代码
37   └─ unittest                      # 单元测试相关代码
38```
39
40## 约束<a name="section128mcpsimp"></a>
41
42-   开发语言:JavaScript。
43-   软件约束:需要与以下服务配合使用:Telephony核心服务(core\_service)。
44-   硬件约束:需要搭载的设备支持以下硬件:可以进行独立蜂窝通信的Modem以及SIM卡。
45-   使用场景:注册获取SIM卡状态接口仅针对有SIM卡在位场景生效,若用户拔出SIM卡,则接收不到回调事件。应用可通过调用getSimState接口来确定当前卡槽是否有卡在位。
46
47## 说明<a name="section134mcpsimp"></a>
48
49### 接口说明<a name="section136mcpsimp"></a>
50
51**表 1**  注册接口
52
53<a name="table165976561598"></a>
54
55| 接口定义                                                     | **接口描述** |
56| ------------------------------------------------------------ | ------------ |
57| function on(type: String, options: { slotId?: number }, callback: AsyncCallback\<T\>): void; | 开启订阅     |
58| function off(type: String, callback?: AsyncCallback\<T\>): void; | 关闭订阅     |
59
60## 使用说明<a name="section163mcpsimp"></a>
61
62### 订阅接口参数说明<a name="section1099113151207"></a>
63
64不同订阅事件通过type进行区分,type列表如下:
65
66**表 2**  type参数说明
67
68<a name="table1234838197"></a>
69
70| type参数                          | 说明                                                  | 所需权限                         |
71| --------------------------------- | ----------------------------------------------------- | -------------------------------- |
72| networkStateChange                | 网络状态变化事件                                      | ohos.permission.GET_NETWORK_INFO |
73| signalInfoChange                  | 信号变化事件                                          | 无                               |
74| cellInfoChange                    | 小区信息变化事件                                      | ohos.permission.LOCATIONohos.permission.APPROXIMATELY_LOCATION         |
75| cellularDataConnectionStateChange | 蜂窝数据连接状态变化事件                              | 无                               |
76| cellularDataFlowChange            | 蜂窝数据流变化事件                                    | 无                               |
77| callStateChange                   | 通话状态变化事件                                      | ohos.permission.READ_CALL_LOG    |
78| simStateChange                    | SIM卡状态变化事件                                     | 无                               |
79
80### 接口调用代码示例<a name="section1558565082915"></a>
81
82以订阅通话状态变化事件为例,主要步骤和代码如下:
83
841.  不同的事件指定不同的type,传入参数,调用on方法开启订阅。
852.  收到回调后,若err为空,则订阅成功,否则订阅失败。订阅成功则可以从value中获取数据。
863.  可以通过off方法取消订阅。取消订阅之后,不会再收到任何回调。
87
88    ```
89    // 引入包名
90    import observer from '@ohos.telephony.observer';
91
92    // 开启订阅
93    observer.on('callStateChange', {slotId: 1}, (err, value) => {
94      if (err) {
95        // 接口调用失败,err非空
96        console.error(`failed, because ${err.message}`);
97        return;
98      }
99      // 接口调用成功,err为空
100      console.log(`success on. number is ` + value.number + ", state is " + value.state);
101    });
102
103    // 关闭订阅
104    observer.off('callStateChange', (err, value) => {
105      if (err) {
106        // 接口调用失败,err非空
107        console.error(`failed, because ${err.message}`);
108        return;
109      }
110      // 接口调用成功,err为空
111      console.log(`success off`);
112    });
113    ```
114
115
116## 相关仓<a name="section206mcpsimp"></a>
117
118[电话服务子系统](https://gitee.com/openharmony/docs/blob/master/zh-cn/readme/电话服务子系统.md)
119
120**telephony_state_registry**
121
122[telephony_core_service](https://gitee.com/openharmony/telephony_core_service/blob/master/README_zh.md)
123
124[telephony_cellular_data](https://gitee.com/openharmony/telephony_cellular_data/blob/master/README_zh.md)
125
126[telephony_cellular_call](https://gitee.com/openharmony/telephony_cellular_call/blob/master/README_zh.md)
127
128[telephony_call_manager](https://gitee.com/openharmony/telephony_call_manager/blob/master/README_zh.md)