查看: 154|回复: 0

鸿蒙元服务makePhoneCall拨打电话API回调与真机调试避坑

[复制链接]
发表于 1 小时前 | 显示全部楼层 |阅读模式
一、场景与 API 定位
在元服务开发中,拨打电话是很常见的需求,例如客服页面一键拨号、紧急联系人快捷拨打。ASCF 提供了 has.makePhoneCall,用来拉起系统拨号界面。它的调用方式很简单,但行为边界和回调时机需要提前理解。

调用后不会直接自动拨出电话,而是进入系统拨号界面,用户确认后才真正拨打。参数上只需要一个 phoneNumber,必填,字符串类型;success、fail、complete 三个回调都是可选的。

基本用法如下:
  1. has.makePhoneCall({
  2.   phoneNumber: '10086',
  3.   success: () => {
  4.     console.info('拨号成功');
  5.   },
  6.   fail: (err) => {
  7.     console.error('拨号失败:', err);
  8.   }
  9. });
复制代码

二、典型业务场景落地
场景一:客服热线。固定号码,用户点一下即拨。
  1. Page({
  2.   callCustomerService() {
  3.     has.makePhoneCall({
  4.       phoneNumber: '400-123-4567',
  5.       success: () => {
  6.         console.info('正在拨打客服电话');
  7.       },
  8.       fail: (err) => {
  9.         console.error('拨打失败:', err);
  10.       }
  11.     });
  12.   }
  13. });
复制代码

场景二:从联系人列表中选择拨打。列表里每个联系人旁边放一个拨号按钮,通过 data-index 传递索引,再取出对应号码。
  1. Page({
  2.   data: {
  3.     contacts: [
  4.       { name: '张三', phone: '13800138001' },
  5.       { name: '李四', phone: '13900139002' },
  6.       { name: '王五', phone: '15000150003' }
  7.     ]
  8.   },
  9.   callContact(e) {
  10.     const index = e.currentTarget.dataset.index;
  11.     const contact = this.data.contacts[index];
  12.     has.makePhoneCall({
  13.       phoneNumber: contact.phone,
  14.       success: () => {
  15.         console.info('正在拨打:', contact.name);
  16.       },
  17.       fail: (err) => {
  18.         console.error('拨打失败:', err);
  19.       }
  20.     });
  21.   }
  22. });
复制代码

模板中可以这样写:
  1. <view class='contact-item' for='{{contacts}}'>
  2.   <text>{{$item.name}} - {{$item.phone}}</text>
  3.   <button size='mini' type='primary' data-index='{{$idx}}' bindtap='callContact'>拨打</button>
  4. </view>
复制代码

场景三:拨打前确认。紧急电话或收费电话等场景,有些产品会希望先弹确认框。不过 ASCF 拉起系统拨号界面时本身就会让用户确认,所以是否额外加确认,要看产品需求。

把输入拨号、快捷号码、拨打历史整合起来,可以得到一个较完整的 Demo:
  1. Page({
  2.   data: {
  3.     phoneNumber: '',
  4.     callHistory: [],
  5.     quickNumbers: [
  6.       { name: '客服热线', phone: '400-123-4567' },
  7.       { name: '技术支持', phone: '400-789-1234' },
  8.       { name: '投诉建议', phone: '400-567-8901' }
  9.     ]
  10.   },
  11.   onInput(e) {
  12.     this.setData({ phoneNumber: e.detail.value });
  13.   },
  14.   dialNumber() {
  15.     const phone = this.data.phoneNumber.trim();
  16.     if (!phone) return;
  17.     this.makeCall(phone);
  18.   },
  19.   dialQuick(e) {
  20.     const index = e.currentTarget.dataset.index;
  21.     const item = this.data.quickNumbers[index];
  22.     this.makeCall(item.phone);
  23.   },
  24.   makeCall(phoneNumber) {
  25.     let that = this;
  26.     has.makePhoneCall({
  27.       phoneNumber: phoneNumber,
  28.       success: () => {
  29.         console.info('拨号成功:', phoneNumber);
  30.         that.addCallHistory(phoneNumber);
  31.       },
  32.       fail: (err) => {
  33.         console.error('拨号失败:', err);
  34.       },
  35.       complete: () => {
  36.         console.info('拨号接口调用完成');
  37.       }
  38.     });
  39.   },
  40.   addCallHistory(phone) {
  41.     let history = this.data.callHistory;
  42.     history = history.filter(item => item !== phone);
  43.     history.unshift(phone);
  44.     if (history.length > 10) {
  45.       history.pop();
  46.     }
  47.     this.setData({ callHistory: history });
  48.   },
  49.   dialHistory(e) {
  50.     const index = e.currentTarget.dataset.index;
  51.     const phone = this.data.callHistory[index];
  52.     this.makeCall(phone);
  53.   }
  54. });
复制代码

三、回调行为与真机排障
号码格式方面,phoneNumber 直接传字符串即可,不需要特殊格式。带横线、带加号、带空格都可以,系统拨号界面会自动处理,例如 +86 138-0013-8001 和 13800138001 都能正常拨打。

fail 回调的触发条件容易误解。用户在系统拨号界面取消返回时,不会触发 fail,success 仍然会触发。fail 只在接口本身调用失败时触发,比如参数错误、系统不支持等。

complete 会在 success 或 fail 之后执行,适合做清理工作。但要注意,它是在拉起拨号界面后就触发,不是等用户打完电话才触发。也就是说,通过这个 API 无法知道用户到底有没有真的拨出去。

模拟器上这个 API 基本没法工作,因为它依赖系统的拨号能力,调试时需要真机验证。

如果页面上有输入框让用户输入号码,拨打完成后要记得清理输入框,或者做防重复点击处理,否则用户连点两下可能拉起两次拨号界面。

版本方面,这个 API 起始版本是 1.0.0,基本不用担心兼容性问题。如果元服务同时需要拨打电话和发送短信,ASCF 目前没有短信 API,需要借助系统能力或其他方式实现。

四、与联系人 API 配合
ASCF 还有联系人相关能力,has.addPhoneContact 可以添加联系人。如果需要“拨打 + 保存联系人”的完整流程,可以把两个 API 结合起来。例如拨打成功后提示用户是否保存到通讯录:
  1. has.makePhoneCall({
  2.   phoneNumber: '13800138001',
  3.   success: () => {
  4.     console.info('是否需要保存到通讯录?');
  5.   }
  6. });
复制代码

五、小结
has.makePhoneCall 的调用门槛很低,但真正落地时,success、fail、complete 的语义、模拟器限制、真机调试、重复点击处理都值得注意。业务上不要把它当成通话结果回调;需要保存联系人时结合 has.addPhoneContact;短信能力则要另找方案。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-9-14 14:44 , Processed in 0.020345 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部