目录

短信服务

场景介绍

短信服务模块提供了管理短信的一些基础能力,包括创建/发送短信、获取/设置发送短信的默认SIM卡槽ID、获取/设置短信服务中心地址,以及检查当前设备是否具备短信发送和接收能力等。

常见的应用场景举例如下:

基本概念

约束与限制

  1. 仅支持在标准系统上运行。
  2. 需授予发送短信权限且插入SIM卡才可成功发送短信。

接口说明

为了保证应用的运行效率,大部分API调用都是异步的,对于异步调用的API均提供了callback和Promise两种方式,以下示例采用callback回调方式,其他调用方式请参考@ohos.telephony.sms (短信服务)文档。

接口名 描述
sendShortMessage(options: SendMessageOptions, callback: AsyncCallback<void>): void 发送文本或数据SMS消息。需要配置ohos.permission.SEND_MESSAGES权限,该权限仅系统应用可申请。
createMessage(pdu: Array<number>, specification: string, callback: AsyncCallback<ShortMessage>): void 基于协议数据单元(PDU)和指定的SMS协议创建SMS消息实例。
getDefaultSmsSlotId(callback: AsyncCallback<number>): void 获取用于发送短信的默认SIM卡。

应用内跳转到短信编辑界面

发送短信的接口需要系统权限才可调用,三方应用如果有发送短信需求,需要在应用内实现跳转到短信编辑的功能,并且需要携带编辑内容和收件人号码,可以通过调用元能力startAbility接口指定号码并跳转到发送短信页面的方式实现。开启混淆后,contactsName和telephone可能被混淆,建议在-keep-property-name保留属性名称。

// 示例代码
import { common, Want } from '@kit.AbilityKit';

const MMS_BUNDLE_NAME = "com.ohos.mms";
const MMS_ABILITY_NAME = "com.ohos.mms.MainAbility";
const MMS_ENTITIES = "entity.system.home";

export class Contact {
    contactsName: string;
    telephone: number;

    constructor(contactsName: string, telephone: number) {
        this.contactsName = contactsName;
        this.telephone = telephone;
    }
}

@Entry
@Component
struct JumpMessage {
    private context = this.getUIContext().getHostContext() as common.UIAbilityContext;

    startMMSAbilityExplicit() {
        // 这里完善联系人和号码;姓名主要是通过手机号来查询实际联系人名称,因此这种方式还是以手机号码为主。
        let params: Array<Object> = [new Contact("张三", 133XXXXXXXX)];

        let want: Want = {
            bundleName: "com.ohos.mms",
            abilityName: "com.ohos.mms.MainAbility",
            parameters: {
                contactObjects: JSON.stringify(params), // 开启混淆后,contactsName和telephone可能被混淆,建议在-keep-property-name保留属性名称
                pageFlag: "conversation",
                // 这里填写短信内容。
                content: "我是短信具体内容"
            }
        };

        this.context.startAbilityForResult(want).then((data) => {
            console.info("Success" + JSON.stringify(data));
        }).catch(() => {
            console.error("error");
        });
    }

    build() {
        Row() {
            Column() {
                Button('发送短信')
                  .onClick(() => {
                      this.startMMSAbilityExplicit();
                  })
            }
            .width('100%')
        }
        .height('100%')
    }
}

sms方式跳转到短信编辑界面

[h2]使用场景

通过sms短信协议,可以创建指向短信收件人的超链接,方便用户通过网页或应用中的超链接直接跳转到短信应用。同时,支持在sms:的相关字段中定义短信的收件人、发送内容等,节省用户编辑短信的时间。

[h2]sms协议格式

sms协议标准格式如下:

sms:106XXXXXXXXXX?body=发送短信内容

[h2]拉起方开发步骤

从网页拉起

网页中的超链接需要满足sms协议。示例如下:

<a href="sms:106XXXXXXXXXX?body=%E5%8F%91%E9%80%81%E7%9F%AD%E4%BF%A1%E5%86%85%E5%AE%B9">发送短信</a>

实际开发时,需要将收件人号码替换为真实的号码,短信内容可以根据需要进行配置。

从应用拉起

保证sms字符串传入uri参数即可,在应用中page页面可通过 this.getUIContext().getHostContext() 获取context,在ability中可通过this.context获取context。

// 示例代码
import { common, Want } from '@kit.AbilityKit';

@Entry
@Component
struct Index {

  build() {
    Column() {
      Button('发送短信')
        .onClick(() => {
          let context = this.getUIContext().getHostContext() as common.UIAbilityContext;
          let exampleUrl = "sms:106XXXXXXXXXX?body=%E5%8F%91%E9%80%81%E7%9F%AD%E4%BF%A1%E5%86%85%E5%AE%B9";
        
          let want: Want = {
              bundleName: 'com.ohos.mms',
              action: 'ohos.want.action.viewData',
              uri:exampleUrl,
            }
        
          context.startAbility(want).then((data) => {
              console.info("Success" + JSON.stringify(data));
          }).catch(() => {
              console.error("error");
          });

        })
    }
  }
}