HarmonyOS鸿蒙Next现在是否可以获取通话记录?

HarmonyOS鸿蒙Next现在是否可以获取通话记录? 【问题描述】:我们的app是疾控中心的医生使用的,我们是做疫苗临床试验的,tob业务,目前我们遇到的问题是next如何能读取通话记录,我看到社区里面说NEXT 设计之初就禁止开放通话记录这个不合理权限,现在想问一下是否可以使用,如果不能使用的话,有什么方案可以解决???

社区资料链接:https://developer.huawei.com/consumer/cn/forum/topic/0210196978547976909?fid=0109140870620153026

cke_9115.png

【原因分析】:HarmonyOS Next现在是否可以获取通话记录????


更多关于HarmonyOS鸿蒙Next现在是否可以获取通话记录?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

12 回复

开发者你好,

出于对用户隐私的保护及安全隐私限制,当前不支持三方应用获取手机通话记录、通话录音、短信记录。

请问您是在什么样的业务场景中使用该能力,交互流程是怎样的,在哪一个环节遇到了问题?方便说明能力不满足可能带来的影响:什么时间用到?是否高频?有无三方库可以做到?若提供该能力,是否会造成大工作量返工?请您注意提供的内容不要包含您或第三方的非公开信息,如给您带来不便,敬请谅解。

更多关于HarmonyOS鸿蒙Next现在是否可以获取通话记录?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


不可以获取通话记录哦!

HarmonyOS NEXT 主打一个安全,效仿iOS的安全机制,APP是无法获取用户的通话记录的。

如果要实现打电话功能可以选择使用:

call.makeCall

支持设备PhonePC/2in1TabletWearable

makeCall(phoneNumber: string, callback: AsyncCallback<void>): void

跳转到拨号界面,并显示待拨出的号码。使用callback异步回调。只支持在UIAbility中调用。

元服务API:从API version 11开始,该接口支持在元服务中使用。

系统能力:SystemCapability.Applications.Contacts

参数:

参数名 类型 必填 说明
phoneNumber string 电话号码。
callback AsyncCallback<void> 以callback形式异步返回跳转拨号界面的结果。

错误码:

以下错误码的详细介绍请参见ohos.telephony(电话子系统)错误码通用错误码

错误码ID 错误信息
401 Parameter error. Possible causes: 1.Mandatory parameters are left unspecified; 2. Incorrect parameters types;
8300001 Invalid parameter value.
8300002 Operation failed. Cannot connect to service.
8300003 System internal error.
8300999 Unknown error code.
import { BusinessError } from '@kit.BasicServicesKit';
// 从API15开始支持tel格式电话号码,如:"tel:13xxxx"
call.makeCall("138xxxxxxxx", (err: BusinessError) => {
    if (err) {
        console.error(`makeCall fail, err->${JSON.stringify(err)}`);
    } else {
        console.log(`makeCall success`);
    }
});

小伙伴你好,可以通过 contact.selectContacts API 来调起系统联系人选择器,让用户选择联系人。

详细说明

使用 contact.selectContacts 调起联系人选择器

方案说明:HarmonyOS Contacts Kit 提供了 selectContacts 接口,可以调起系统联系人列表界面供用户选择联系人,返回所选联系人数据。使用 Picker 的好处是只需用户选择,无需在应用内部申请高敏权限读取所有联系人数据。详细使用指南请参考:使用 picker 选择联系人

实现步骤

1. 导入 contact 模块

导入语句

import { contact } from '@kit.ContactsKit';
import { BusinessError } from '@kit.BasicServicesKit';

说明:在 HarmonyOS Next API 10+ 中,推荐使用 @kit.ContactsKit 导入方式。如果使用 API 9 及以下版本,可以使用 import contact from '@ohos.contact' 方式。

2. 调用 selectContacts 接口

代码示例

回调方式

/**
 * 选择单个联系人
 * 
 * @param callback 选择完成后的回调函数
 */
function selectSingleContact(callback: (contacts: Array<contact.Contact>) => void): void {
  contact.selectContacts(
    { isMultiSelect: false },
    (err: BusinessError, data: Array<contact.Contact>) => {
      if (err) {
        console.error(`selectContacts callback: err code = ${err.code}, message = ${err.message}`);
        return;
      }
      console.info(`selectContacts callback: success, data = ${JSON.stringify(data)}`);
      callback(data);
    }
  );
}

Promise 方式

/**
 * 选择多个联系人
 * 
 * @returns Promise<Array<Contact>> 返回选中的联系人数组
 */
async function selectMultipleContacts(): Promise<Array<contact.Contact>> {
  try {
    const contacts = await contact.selectContacts({ isMultiSelect: true });
    console.info(`selectContacts success, data = ${JSON.stringify(contacts)}`);
    return contacts;
  } catch (err) {
    const be = err as BusinessError;
    console.error(`selectContacts failed: code = ${be.code}, message = ${be.message}`);
    throw err;
  }
}

完整组件示例

import { contact } from '@kit.ContactsKit';
import { BusinessError } from '@kit.BasicServicesKit';

@ComponentV2
struct ContactPickerPage {
  @State selectedContacts: Array<contact.Contact> = [];

  /**
   * 调起联系人选择器(单选)
   */
  selectContact(): void {
    contact.selectContacts(
      { isMultiSelect: false },
      (err: BusinessError, data: Array<contact.Contact>) => {
        if (err) {
          console.error(`选择联系人失败: code = ${err.code}, message = ${err.message}`);
          return;
        }
        this.selectedContacts = data;
        console.info(`已选择联系人: ${JSON.stringify(data)}`);
      }
    );
  }

  /**
   * 调起联系人选择器(多选)
   */
  async selectMultipleContacts(): Promise<void> {
    try {
      const contacts = await contact.selectContacts({ isMultiSelect: true });
      this.selectedContacts = contacts;
      console.info(`已选择 ${contacts.length} 个联系人`);
    } catch (err) {
      const be = err as BusinessError;
      console.error(`选择联系人失败: code = ${be.code}, message = ${be.message}`);
    }
  }

  build() {
    Column() {
      Button('选择单个联系人')
        .onClick(() => {
          this.selectContact();
        })
      
      Button('选择多个联系人')
        .onClick(() => {
          this.selectMultipleContacts();
        })
      
      if (this.selectedContacts.length > 0) {
        Text(`已选择 ${this.selectedContacts.length} 个联系人`)
          .margin({ top: 20 })
      }
    }
    .width('100%')
    .height('100%')
    .padding(20)
  }
}

关键 API 说明

  • contact.selectContacts(options, callback):调起联系人选择器,支持回调方式
    • options: ContactSelectionOptions:选择器配置选项(必填)
    • callback: AsyncCallback<Array<Contact>>:回调函数,返回错误或联系人数组
  • contact.selectContacts(options): Promise<Array>:调起联系人选择器,支持 Promise 方式
    • options?: ContactSelectionOptions:选择器配置选项(可选)
    • 返回 Promise<Array<Contact>>:成功时返回联系人数组,失败时抛出 BusinessError
  • ContactSelectionOptions:选择器配置选项
    • isMultiSelect: boolean:是否支持多选,false 为单选,true 为多选

返回数据结构

联系人对象(Contact)包含以下常用字段:

interface Contact {
  id: number;                    // 联系人ID
  key: string;                   // 联系人唯一标识
  name: {
    fullName: string;            // 全名
  };
  nickName?: {
    nickName: string;            // 昵称
  };
  phoneNumbers?: Array<{
    phoneNumber: string;         // 电话号码
    labelName: string;            // 标签名称(如"手机"、"工作"等)
    labelId: number;             // 标签ID
  }>;
  emails?: Array<{
    emailAddress: string;        // 邮箱地址
    labelName: string;
  }>;
  portrait?: {
    uri: string;                 // 头像URI
  };
  note?: {
    noteContent: string;         // 备注
  };
  organizations?: {
    name: string;                // 组织名称
  };
}

注意事项

  • 权限说明
    • 调起联系人 Picker 本身不需要预先申请读取联系人权限
    • 但如果要读取联系人详细信息(如电话号码、邮箱等),应用仍需在 module.json5 中声明 ohos.permission.READ_CONTACTS 权限
    • 对于写入操作(新增、修改、删除联系人),需要 ohos.permission.WRITE_CONTACTS 权限(system_basic 级别)
  • API 版本差异
    • selectContacts 从 API 10 开始支持,推荐使用
    • 注意检查应用的最低 API 版本要求
  • 错误处理
    • 主要错误包括参数错误、权限拒绝、用户取消选择等
    • 错误码可在回调的 BusinessError.code 中获取
    • 建议添加完整的错误处理逻辑
  • 用户体验
    • isMultiSelect 参数用于控制是否能选择多个联系人
    • 设为 false 时只能选择一个联系人
    • 设为 true 时支持多选
  • 返回数据
    • 返回的联系人数据可能受权限控制影响
    • 如果应用没有读取联系人权限,返回的数据可能不完整
    • 建议兼容权限被拒绝或返回数据不全的情况

参考文档

这是系统出于隐私安全的底线设计。正如您在社区看到的讨论,HarmonyOS NEXT 进一步收紧了隐私权限,READ_CALL_LOG 这类高敏感权限对第三方应用(即使是 B2B 企业应用)是不开放的。

通话记录包含极其隐私的用户社交关系和行为数据。鸿蒙 的安全架构(鸿蒙)去掉了安卓的兼容层,彻底封死了通过“侧门”或“老旧API”获取数据的路径。

总的来说,HarmonyOS是一款非常优秀的操作系统,期待它能在未来带给我们更多惊喜!

ohos.permission.READ_CONTACTS

允许应用读取联系人数据。

可申请此权限的特殊场景与功能:

应用需要克隆、备份或同步联系人信息。

例如:

  1. 应用需要批量读取本机通讯录数据,并同步到云端服务器。
  2. 应用需要批量读取通讯录数据,在设备间进行同步或者克隆操作。

其他场景下的使用方案: 使用“联系人Picker”访问联系人数据,使用方式请参考:使用Picker选择联系人

权限级别:system_basic

授权方式:用户授权(user_grant)

起始版本:8

Contacts Kit简介

import { contact } from '@kit.ContactsKit';
import { BusinessError } from '@kit.BasicServicesKit';
contact.selectContacts({
  isMultiSelect:false
},(err: BusinessError, data) => {
    if (err) {
      console.error('selectContact callback, errCode:' + err.code + ', errMessage:' + err.message);
        return;
    }
    console.info(`selectContact callback: success data->${JSON.stringify(data)}`);
});

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17

是无法获取到通话记录

建议发起工单和华为对接,说明应用需求

通话记录是不能获取的,但是你可以拉起联系人窗口。然后让用户自己选择:用Picker选择联系人

你看看这个对你有没有帮助。

HarmonyOS Next当前未开放通话记录相关API。根据官方文档,系统暂未提供获取通话记录的标准接口。

根据HarmonyOS Next当前的隐私安全设计原则和公开的API能力,应用无法直接读取设备上的通话记录。这一限制是系统层面的,旨在保护用户的高度敏感数据。

对于您提到的疾控中心疫苗临床试验的ToB业务场景,如果需要获取与工作相关的通话信息,可以考虑以下技术方案:

  1. 应用内通话与记录:如果业务场景中的通话是工作沟通的一部分,最直接且合规的方案是在您的应用内集成音视频通话能力(例如通过集成华为的CC或相关SDK)。这样所有通话通过您的应用发起,通话记录(如通话时间、对方标识)可以自然地由应用自身生成、存储和管理,完全在可控的闭环内。

  2. 用户主动上报与确认:对于必须关联外部通话记录的场景(例如,医生需要记录与受试者的某次手机通话),可以设计业务流程,引导用户在应用内手动填写关键信息(如日期、时间、简要内容),或通过安全的方式(如分享特定的日程、笔记链接)进行关联。这需要结合良好的产品设计来保证数据准确性。

核心在于,HarmonyOS Next将通话记录视为由系统核心服务管理的敏感数据,不向第三方应用开放读取权限。因此,解决方案需要将数据生产与记录环节都置于您的应用生态内部,或依赖用户的主动操作与授权来间接完成信息关联。

回到顶部