1# 短信服务 2 3## 场景介绍 4 5短信服务模块提供了管理短信的一些基础能力,包括创建/发送短信、获取/设置发送短信的默认SIM卡槽ID、获取/设置短信服务中心地址,以及检查当前设备是否具备短信发送和接收能力等。 6 7常见的应用场景举例如下: 8 9- 从网页拉起: 10 - 用户在网页上浏览,看到“发送短信”按钮,点击后会拉起短信应用,预先填写收件人号码、发送内容。 11- 从应用拉起: 12 - 移动应用中,用户点击“发送短信”按钮时,应用调用系统功能,拉起短信应用,预先填写收件人号码、发送内容。 13 14## 基本概念 15 16- 短信服务 17 18 即SMS(Short Messaging Service),是一种存储和转发服务。用户的移动电话可以通过它进行相互收发短信,内容以文本、数字或二进制非文本数据为主。发送方的信息通过短信服务中心进行储存并转发给接收方。 19- 短信服务中心 20 21 即SMSC(Short Message Service Center),负责在基站和移动设备间中继、储存或转发短消息。移动设备到短信服务中心的协议能传输来自移动设备或朝向移动设备的短消息,协议内容遵从GSM 03.40协议。 22- 协议数据单元 23 24 即PDU(Protocol Data Unit),PDU模式收发短信可以使用3种编码:7-bit、8-bit和UCS-2编码。7-bit编码用于发送普通的ASCII字符,8-bit编码通常用于发送数据短信,UCS-2编码用于发送Unicode字符。 25 26## 约束与限制 27 281. 仅支持在标准系统上运行。 292. 需授予发送短信权限且插入SIM卡才可成功发送短信。 30 31## 接口说明 32 33> **说明:** 34> 为了保证应用的运行效率,大部分API调用都是异步的,对于异步调用的API均提供了callback和Promise两种方式,以下示例采用callback回调方式,其他调用方式请参考[API](../reference/apis-telephony-kit/js-apis-sms.md)文档。 35 36| 接口名 | 描述 | 37| ------------------------------------------------------------ | ------------------------------------------------------- | 38| sendShortMessage(options: SendMessageOptions, callback: AsyncCallback\<void\>): void | 发送文本或数据SMS消息。需要配置ohos.permission.SEND_MESSAGES权限,该权限仅系统应用可申请。 | 39| createMessage(pdu: Array\<number\>, specification: string, callback: AsyncCallback\<ShortMessage\>): void | 基于协议数据单元(PDU)和指定的SMS协议创建SMS消息实例。 | 40| getDefaultSmsSlotId(callback: AsyncCallback\<number\>): void | 获取用于发送短信的默认SIM卡。 | 41| <!--DelRow-->setSmscAddr(slotId: number, smscAddr: string, callback: AsyncCallback\<void\>): void | 根据指定的插槽ID设置短信服务中心的地址。 | 42| <!--DelRow-->getSmscAddr(slotId: number, callback: AsyncCallback\<string>): void | 根据指定的插槽ID获取短信服务中心地址。 | 43 44<!--Del--> 45 46## 发送短信(仅供系统应用使用) 47 481. 声明接口调用所需要的权限: 49 50 - 如果是想发送短信,则调用sendShortMessage接口,需要配置ohos.permission.SEND_MESSAGES权限,权限级别为system_basic。 51 - 如果是想设置短信服务中心地址,则调用setSmscAddr接口,需要配置ohos.permission.SET_TELEPHONY_STATE权限,权限级别为system_basic。 52 - 如果是想获取短信服务中心地址,则调用getSmscAddr接口,需要配置ohos.permission.GET_TELEPHONY_STATE权限,权限级别为system_basic。 53 在申请权限前,请保证符合[权限使用的基本原则](../security/AccessToken/app-permission-mgmt-overview.md#权限使用的基本原则)。然后参考[申请应用权限](../security/AccessToken/determine-application-mode.md#system_basic等级应用申请权限的方式)声明对应权限。 542. import需要的模块。 55 563. 发送SMS消息。 57 58```ts 59// 示例代码 60import { sms } from '@kit.TelephonyKit'; 61import { AsyncCallback, BusinessError } from '@kit.BasicServicesKit'; 62 63let sendCallback: AsyncCallback<sms.ISendShortMessageCallback> = (err: BusinessError, data: sms.ISendShortMessageCallback) => { 64 console.log(`sendCallback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); 65} 66let deliveryCallback: AsyncCallback<sms.IDeliveryShortMessageCallback> = (err: BusinessError, data: sms.IDeliveryShortMessageCallback) => { 67 console.log(`deliveryCallback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); 68} 69let slotId: number = 0; 70let content: string = '短信内容'; 71let destinationHost: string = '+861xxxxxxxxxx'; 72let serviceCenter: string = '+861xxxxxxxxxx'; 73let destinationPort: number = 1000; 74let options: sms.SendMessageOptions = {slotId, content, destinationHost, serviceCenter, destinationPort, sendCallback, deliveryCallback}; 75sms.sendShortMessage(options, (err: BusinessError) => { 76 console.log(`callback: err->${JSON.stringify(err)}`); 77}); 78 79``` 80 81<!--DelEnd--> 82 83## 应用内跳转到短信编辑界面 84 85发送短信的接口需要系统权限才可调用,三方应用如果有发送短信需求,需要在应用内实现跳转到短信编辑的功能,并且需要携带编辑内容和收件人号码,可以通过调用元能力startAbility接口指定号码并跳转到发送短信页面的方式实现。 86 87```ts 88// 示例代码 89import { common, Want } from '@kit.AbilityKit'; 90 91const MMS_BUNDLE_NAME = "com.ohos.mms"; 92const MMS_ABILITY_NAME = "com.ohos.mms.MainAbility"; 93const MMS_ENTITIES = "entity.system.home"; 94 95export class Contact { 96 contactsName: string; 97 telephone: number; 98 99 constructor(contactsName: string, telephone: number) { 100 this.contactsName = contactsName; 101 this.telephone = telephone; 102 } 103} 104 105@Entry 106@Component 107struct JumpMessage { 108 private context = getContext(this) as common.UIAbilityContext; 109 110 startMMSAbilityExplicit() { 111 // 这里完善联系人和号码;姓名主要是通过手机号来查询实际联系人名称,因此这种方式还是以手机号码为主。 112 let params: Array<Object> = [new Contact("张三", 133XXXXXXXX)]; 113 114 let want: Want = { 115 bundleName: "com.ohos.mms", 116 abilityName: "com.ohos.mms.MainAbility", 117 parameters: { 118 contactObjects: JSON.stringify(params), 119 pageFlag: "conversation", 120 // 这里填写短信内容。 121 content: "我是短信具体内容" 122 } 123 }; 124 125 this.context.startAbilityForResult(want).then((data) => { 126 console.log("Success" + JSON.stringify(data)); 127 }).catch(() => { 128 console.log("error"); 129 }); 130 } 131 132 build() { 133 Row() { 134 Column() { 135 Button('发送短信') 136 .onClick(() => { 137 this.startMMSAbilityExplicit(); 138 }) 139 } 140 .width('100%') 141 } 142 .height('100%') 143 } 144} 145 146``` 147 148## sms方式跳转到短信编辑界面 149 150### 使用场景 151 152通过sms短信协议,可以创建指向短信收件人的超链接,方便用户通过网页或应用中的超链接直接跳转到短信应用。同时,支持在`sms:`的相关字段中定义短信的收件人、发送内容等,节省用户编辑短信的时间。 153 154### sms协议格式 155 156sms协议标准格式如下: 157 158``` 159sms:106XXXXXXXXXX?body=发送短信内容 160``` 161 162+ `sms:`:sms scheme,必填。 163+ `106XXXXXXXXXX:收件人号码,选填。如果存在多个地址,用英文逗号分隔。 164+ `?`:短信内容声明开始符号。如果带短信内容参数,则必填。 165+ `body-value`:发送内容参数,选填。 166 167### 拉起方开发步骤 168 169#### 从网页拉起 170 171网页中的超链接需要满足sms协议。示例如下: 172 173``` 174<a href="sms:106XXXXXXXXXX?body=%E5%8F%91%E9%80%81%E7%9F%AD%E4%BF%A1%E5%86%85%E5%AE%B9">发送短信</a> 175``` 176 177实际开发时,需要将收件人号码替换为真实的号码,短信内容可以根据需要进行配置。 178 179#### 从应用拉起 180 181保证sms字符串传入uri参数即可,在应用中page页面可通过 getContext(this) 获取context,在ability中可通过this.context获取context。 182 183```ts 184@Entry 185@Component 186struct Index { 187 188 build() { 189 Column() { 190 Button('发送短信') 191 .onClick(() => { 192 let context = this.getUIContext().getHostContext() as common.UIAbilityContext; 193 let exampleUrl = "sms:106XXXXXXXXXX?body=%E5%8F%91%E9%80%81%E7%9F%AD%E4%BF%A1%E5%86%85%E5%AE%B9"; 194 195 let want: Want = { 196 bundleName: 'com.ohos.mms', 197 action: 'ohos.want.action.viewData', 198 uri:exampleUrl, 199 } 200 201 context.startAbility(want).then((data) => { 202 console.log("Success" + JSON.stringify(data)); 203 }).catch(() => { 204 console.log("error"); 205 }); 206 207 }) 208 } 209 } 210} 211``` 212 213## 相关实例 214 215针对短信的使用,有以下相关实例可供参考: 216 217- [短信服务(ArkTS)(Full SDK)(API9)](https://gitee.com/openharmony/applications_app_samples/tree/master/code/SystemFeature/Telephony/Message)