HarmonyOS鸿蒙Next中想要在应用内获取到短信的内容比如说验证码,怎么能获取到?

HarmonyOS鸿蒙Next中想要在应用内获取到短信的内容比如说验证码,怎么能获取到?

【问题描述】:我想要在应用内获取短信的内容,比如说菜鸟APP,在应用内显示短信中的取件码,这个功能怎么实现?

【问题现象】:在应用内获取短信的内容,展示类似验证码取件码的内容

【版本信息】:不涉及

【复现代码】:不涉及

【尝试解决方案】:不涉及

8 回复

HarmonyOS NEXT 高度重视用户隐私保护,短信内容属于用户核心隐私信息,因此该系统下无法直接获取短信中的取件码。

若需获取对应取件码,可通过快递鸟的开放接口实现,该方式能安全合规地获取相关取件信息。

相关文档:【取件码API】

更多关于HarmonyOS鸿蒙Next中想要在应用内获取到短信的内容比如说验证码,怎么能获取到?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


根据鸿蒙(HarmonyOS)ArkTS开发规范,应用内直接读取短信内容(如验证码)涉及用户隐私和安全限制,系统未开放短信内容读取权限。以下是合规实现方案:

替代方案:验证码自动填充

通过系统级短信授权服务实现验证码自动填充(无需读取完整短信)
参考:
自动读取短信验证码(可选)-接口说明-Android-华为帐号服务 - 华为HarmonyOS开发者
授权读取短信验证码(可选)-接口说明-Android-华为帐号服务 - 华为HarmonyOS开发者

可以参考一下鸿蒙应用 码上取 的实现。

我推荐的是通过 访问剪贴板权限 来获取短信验证码。

剪贴板为应用提供如下两种访问内容的方式。

  • 使用安全控件 使用安全控件访问剪贴板内容的应用,可以无需申请权限。 已经使用了安全控件的应用无需做任何适配就可以访问剪贴板内容。

  • 申请ohos.permission.READ_PASTEBOARD权限 ohos.permission.READ_PASTEBOARD是受限的user_grant(用户授权)权限,使用自定义控件的应用申请此权限后,在用户授权场景下可访问剪贴板内容。 权限申请步骤:

  1. 查看READ_PASTEBOARD介绍,审视应用是否符合申请该权限的使用场景。
  2. 在AGC侧申请Profile文件,将用于后续的应用签名信息配置。
  3. 在module.json5配置文件中声明权限
  4. 通过弹窗向用户申请权限

粘贴控件是一种特殊的系统安全控件,它允许应用在用户的授权下无提示地读取剪贴板数据。

集成粘贴控件后,单击该控件时,应用读取剪贴板数据不会弹窗提示。适用于任何需要读取剪贴板的应用场景,避免弹窗干扰用户。

例如,用户在应用外(如短信)复制了验证码,要在应用内粘贴验证码。用户原来在进入应用后,还需要长按输入框、在弹出的选项中点击粘贴,才能完成输入。而使用粘贴控件,用户只需进入应用后直接点击粘贴按钮,即可一步到位。

cke_188.png

约束与限制

  • 临时授权会持续到灭屏、应用切后台或应用退出时终止。
  • 应用在授权期间的调用次数无限制。
  • 为了保障用户隐私,应用需确保安全控件可见且可识别。开发者应合理配置控件的尺寸和颜色等属性,避免视觉混淆。若因控件样式不合法导致授权失败请检查设备错误日志。

开发步骤

以简化用户填写验证码为例,参考以下步骤:单击控件获取临时授权,将内容粘贴到文本框。效果图见上文。

  1. 导入剪贴板依赖。

    import { pasteboard } from '[@kit](/user/kit).BasicServicesKit';
    
  2. 添加输入框和粘贴控件。

    粘贴控件是一种类似按钮的安全控件,由图标、文本和背景组成。其中,背景是必选的,而图标和文本至少需要选择其一。图标和文本不支持自定义,仅能在已有的选项中选择。

    应用安全控件的接口时,分为传参和不传参两种情况。不传参时,默认创建包含图标、文本和背景的按钮;传参时,根据传入的参数创建按钮,不包含未配置的元素。

    当前示例使用了默认参数。具体详情,请参见PasteButton控件。此外,所有安全控件均继承了安全控件通用属性,可用于自定义样式。

import { pasteboard, BusinessError } from '[@kit](/user/kit).BasicServicesKit';
@Entry
@Component
struct Index {
  @State message: string = '';
  build() {
    Row() {
      Column({ space: 10 }) {
        TextInput({ placeholder: '请输入验证码', text: this.message })
        PasteButton()
          .padding({top: 12, bottom: 12, left: 24, right: 24})
          .onClick((event: ClickEvent, result: PasteButtonOnClickResult) => {
            if (PasteButtonOnClickResult.SUCCESS === result) {
              pasteboard.getSystemPasteboard().getData((err: BusinessError, pasteData: pasteboard.PasteData) => {
                if (err) {
                  console.error(`Failed to get paste data. Code is ${err.code}, message is ${err.message}`);
                  return;
                }
                // 剪贴板内容为 '123456'。
                this.message = pasteData.getPrimaryText();
              });
            }
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

我现在想要的是自动获取,这个控件是要手动获取的吧,

自动获取就有隐私问题了,就算申请了剪贴板权限,在后台你也获取不了。

在HarmonyOS Next中,应用获取短信内容需使用@ohos.telephony.sms模块。首先申请ohos.permission.RECEIVE_SMS权限,在module.json5中配置。通过on('smsReceive')监听短信接收事件,回调函数中解析短信内容。验证码可通过正则表达式从短信文本中提取。注意仅支持授权后的应用在后台获取短信,系统会过滤非验证码类短信。

在HarmonyOS Next中,应用无法直接读取系统短信内容,这是出于用户隐私和安全保护的考虑。但可以通过以下方式实现类似功能:

  1. 使用HarmonyOS的SMS验证码自动读取功能:

    • 系统会自动识别包含验证码的短信,并通过系统API提供给应用
    • 应用需要声明ohos.permission.RECEIVE_SMS权限
    • 在config.json中配置权限声明
  2. 实现SMS接收监听:

    // 注册短信接收监听
    import sms from '[@ohos](/user/ohos).telephony.sms';
    
    sms.on('messageReceived', (data) => {
      // 处理接收到的短信
      const message = data.message;
      // 解析验证码或取件码
    });
    
  3. 替代方案:

    • 使用推送服务直接接收验证信息
    • 通过服务器中转验证码
    • 调用系统分享接口,让用户主动选择分享短信内容

建议采用系统提供的标准验证码读取机制,这既符合隐私规范,又能保证功能稳定性。具体实现需要参考HarmonyOS官方文档中的SMS管理模块。

回到顶部