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

【原因分析】:HarmonyOS Next现在是否可以获取通话记录????
更多关于HarmonyOS鸿蒙Next现在是否可以获取通话记录?的实战教程也可以访问 https://www.itying.com/category-93-b0.html
开发者你好,
出于对用户隐私的保护及安全隐私限制,当前不支持三方应用获取手机通话记录、通话录音、短信记录。
请问您是在什么样的业务场景中使用该能力,交互流程是怎样的,在哪一个环节遇到了问题?方便说明能力不满足可能带来的影响:什么时间用到?是否高频?有无三方库可以做到?若提供该能力,是否会造成大工作量返工?请您注意提供的内容不要包含您或第三方的非公开信息,如给您带来不便,敬请谅解。
更多关于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
允许应用读取联系人数据。
可申请此权限的特殊场景与功能:
应用需要克隆、备份或同步联系人信息。
例如:
- 应用需要批量读取本机通讯录数据,并同步到云端服务器。
- 应用需要批量读取通讯录数据,在设备间进行同步或者克隆操作。
其他场景下的使用方案: 使用“联系人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业务场景,如果需要获取与工作相关的通话信息,可以考虑以下技术方案:
-
应用内通话与记录:如果业务场景中的通话是工作沟通的一部分,最直接且合规的方案是在您的应用内集成音视频通话能力(例如通过集成华为的CC或相关SDK)。这样所有通话通过您的应用发起,通话记录(如通话时间、对方标识)可以自然地由应用自身生成、存储和管理,完全在可控的闭环内。
-
用户主动上报与确认:对于必须关联外部通话记录的场景(例如,医生需要记录与受试者的某次手机通话),可以设计业务流程,引导用户在应用内手动填写关键信息(如日期、时间、简要内容),或通过安全的方式(如分享特定的日程、笔记链接)进行关联。这需要结合良好的产品设计来保证数据准确性。
核心在于,HarmonyOS Next将通话记录视为由系统核心服务管理的敏感数据,不向第三方应用开放读取权限。因此,解决方案需要将数据生产与记录环节都置于您的应用生态内部,或依赖用户的主动操作与授权来间接完成信息关联。

