• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 短信服务
2
3## 场景介绍
4
5短信服务模块提供了管理短信的一些基础能力,包括创建、发送短信,获取、设置发送短信的默认SIM卡槽ID,获取、设置短信服务中心地址,以及检查当前设备是否具备短信发送和接收能力等。
6
7## 基本概念
8
9- 短信服务
10
11  即SMS(Short Messaging Service),是一种存储和转发服务。用户的移动电话可以通过它进行相互收发短信,内容以文本、数字或二进制非文本数据为主。发送方的信息通过短信服务中心进行储存并转发给接收方。
12
13- 短信服务中心
14
15  即SMSC(Short Message Service Center),负责在基站和移动设备间中继、储存或转发短消息。移动设备到短信服务中心的协议能传输来自移动设备或朝向移动设备的短消息,协议内容遵从GSM 03.40协议。
16
17- 协议数据单元
18
19  即PDU(Protocol Data Unit),PDU模式收发短信可以使用3种编码:7-bit、8-bit和UCS-2编码。7-bit编码用于发送普通的ASCII字符,8-bit编码通常用于发送数据短信,UCS-2编码用于发送Unicode字符。
20
21## 约束与限制
22
231. 仅支持在标准系统上运行。
242. 需授予发送短信权限且插入SIM卡才可成功发送短信。
25
26
27## 接口说明
28
29> **说明:**
30> 为了保证应用的运行效率,大部分API调用都是异步的,对于异步调用的API均提供了callback和Promise两种方式,以下示例均采用callback函数,更多方式可以查阅[API参考](../reference/apis-telephony-kit/js-apis-sms.md)。
31
32| 接口名                                                       | 描述                                                    |
33| ------------------------------------------------------------ | ------------------------------------------------------- |
34| sendShortMessage(options: SendMessageOptions, callback: AsyncCallback\<void\>): void              | 发送文本或数据SMS消息。                                                      |
35| createMessage(pdu: Array\<number\>, specification: string, callback: AsyncCallback\<ShortMessage\>): void | 基于协议数据单元(PDU)和指定的SMS协议创建SMS消息实例。 |
36| getDefaultSmsSlotId(callback: AsyncCallback\<number\>): void   | 获取用于发送短信的默认SIM卡。                                                |
37| setSmscAddr(slotId: number, smscAddr: string, callback: AsyncCallback\<void\>): void | 根据指定的插槽ID设置短信服务中心的地址。                |
38| getSmscAddr(slotId: number, callback: AsyncCallback\<string>): void | 根据指定的插槽ID获取短信服务中心地址。                                  |
39
40
41## 开发步骤
42
431. 声明接口调用所需要的权限:
44   - 如果是想发送短信,则调用sendShortMessage接口,需要配置ohos.permission.SEND_MESSAGES权限,权限级别为system_basic。
45   - 如果是想设置短信服务中心地址,则调用setSmscAddr接口,需要配置ohos.permission.SET_TELEPHONY_STATE权限,权限级别为system_basic。
46   - 如果是想获取短信服务中心地址,则调用getSmscAddr接口,需要配置ohos.permission.GET_TELEPHONY_STATE权限,权限级别为system_basic。
47   在申请权限前,请保证符合[权限使用的基本原则](../security/AccessToken/app-permission-mgmt-overview.md#权限使用的基本原则)。然后参考[申请应用权限](../security/AccessToken/determine-application-mode.md#system_basic等级的应用申请权限)声明对应权限。
48
492. 但是通常情况下,第三方应用无法获取上述权限,若需要在应用内实现跳转到短信编辑的功能,并且需要携带编辑内容和收件人号码,可以通过调用元能力 startAbility 接口指定号码并跳转到发送短信页面的方式实现,参考示例代码二。
50
513. import需要的模块。
52
534. 发送SMS消息。
54
55```ts
56// 示例代码一:
57import sms from '@ohos.telephony.sms';
58import { AsyncCallback } from '@ohos.base';
59import { BusinessError } from '@ohos.base';
60
61let sendCallback: AsyncCallback<sms.ISendShortMessageCallback> = (err: BusinessError, data: sms.ISendShortMessageCallback) => {
62    console.log(`sendCallback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`);
63}
64let deliveryCallback: AsyncCallback<sms.IDeliveryShortMessageCallback> = (err: BusinessError, data: sms.IDeliveryShortMessageCallback) => {
65    console.log(`deliveryCallback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`);
66}
67let slotId: number = 0;
68let content: string = '短信内容';
69let destinationHost: string = '+861xxxxxxxxxx';
70let serviceCenter: string = '+861xxxxxxxxxx';
71let destinationPort: number = 1000;
72let options: sms.SendMessageOptions = {slotId, content, destinationHost, serviceCenter, destinationPort, sendCallback, deliveryCallback};
73sms.sendShortMessage(options, (err: BusinessError) => {
74    console.log(`callback: err->${JSON.stringify(err)}`);
75});
76
77
78// 示例代码二:
79import common from '@ohos.app.ability.common';
80import Want from '@ohos.app.ability.Want';
81
82const MMS_BUNDLE_NAME = "com.ohos.mms";
83const MMS_ABILITY_NAME = "com.ohos.mms.MainAbility";
84const MMS_ENTITIES = "entity.system.home";
85
86export class Contact {
87    contactsName: string;
88    telephone: number;
89
90    constructor(contactsName: string, telephone: number) {
91        this.contactsName = contactsName;
92        this.telephone = telephone;
93    }
94}
95
96@Entry
97@Component
98struct JumpMessage {
99    private context = getContext(this) as common.UIAbilityContext;
100
101    startMMSAbilityExplicit() {
102        // 这里完善联系人和号码;姓名主要是通过手机号来查询实际联系人名称,因此这种方式还是以手机号码为主。
103        let params: Array<Object> = [new Contact("张三", 13344556677)];
104
105        let want: Want = {
106            bundleName: "com.ohos.mms",
107            abilityName: "com.ohos.mms.MainAbility",
108            parameters: {
109                contactObjects: JSON.stringify(params),
110                pageFlag: "conversation",
111                // 这里填写短信内容。
112                content: "我是短信具体内容"
113            }
114        };
115
116        this.context.startAbilityForResult(want).then((data) => {
117            console.log("Success" + JSON.stringify(data));
118        }).catch(() => {
119            console.log("error");
120        });
121    }
122
123    build() {
124        Row() {
125            Column() {
126                Button('发送短信')
127                  .onClick(() => {
128                      this.startMMSAbilityExplicit();
129                  })
130            }
131            .width('100%')
132        }
133        .height('100%')
134    }
135}
136```
137
138
139## 相关实例
140
141针对短信的使用,有以下相关实例可供参考:
142
143- [短信服务(ArkTS)(Full SDK)(API9)](https://gitee.com/openharmony/applications_app_samples/tree/master/code/BasicFeature/Telephony/Message)
144