一、问题现象

最近在用 DevEco Studio 给设备运行应用时,遇到了这样一个报错:

ErrorCode: 00401004
ErrorDescription: Please try to match the API version of the device and the app. The current device does not contain the following SysCap attributes in the rpcid.json file: SystemCapability.Telephony.CellularCall. Make sure the device supports all the SysCap attributes required for running the app.

刚看到这个报错的时候,我第一反应是:

是不是 API 版本不匹配

因为报错里面有一句:

Please try to match the API version of the device and the app.

但后来仔细看后半段才发现,真正的问题不在 API version,而在 SysCap


二、问题本质分析

报错里最关键的一句其实是:

The current device does not contain the following SysCap attributes:
SystemCapability.Telephony.CellularCall

也就是说:

  • 当前应用要求了 SystemCapability.Telephony.CellularCall

  • 但是当前运行设备并不具备这个系统能力

  • 所以安装/运行时直接失败,报了 00401004

这里的 SystemCapability.Telephony.CellularCall,一看名字就知道,和 电话/蜂窝通话能力 有关。

如果你的设备本身不是手机,而是:

  • 开发板

  • 工控设备

  • 平板

  • 不带蜂窝通话能力的终端

那么它没有这个 SysCap 很正常。

所以这个问题本质上不是“代码写错了”,而是:

应用声明的系统能力,超过了当前设备实际具备的系统能力。


三、我的解决办法

如果你的应用 根本不需要电话/蜂窝通话功能,那就可以在模块里增加 syscap.json,把这个不需要的能力移除掉。

1、在模块目录下新建 syscap.json

路径如下:

entry/src/main/syscap.json

2、写入以下内容

{
"devices": {
"general": [
"default"
]
},
"production": {
"removedSysCaps": [
"SystemCapability.Telephony.CellularCall"
]
}
}

3、然后重新构建工程

建议按下面顺序操作:

  1. Clean Project

  2. 删除模块下的 build 目录

  3. 重新 Sync

  4. 再次运行/安装应用

我这边就是这样处理后,问题解决的。


四、为什么这样能解决

因为当前并不是设备坏了,也不是代码语法错误,而是应用带上了一个当前设备没有的能力要求。

通过 syscap.json 里的:

"removedSysCaps": [
"SystemCapability.Telephony.CellularCall"
]

可以把这个当前模块里“不需要但被带进来的系统能力”移除掉。

这样一来:

  • 应用要求的能力集减少了

  • 和设备实际支持的能力集匹配了

  • 应用就可以正常安装/运行了


五、注意事项

这个方法不是无脑通杀,有一个前提:

前提:你的应用真的没有用到电话功能

也就是说,你的工程里最好确认一下,没有真正依赖这些内容:

  • TelephonyKit

  • CellularCall

  • callManager

  • 电话/拨号/通话相关 API

  • 某些带电话能力的三方库

因为如果你的代码里本来就真的在用这些功能,那你只是把 SysCap 声明删掉,后面运行到相关逻辑时,依然可能报错。


六、建议顺手做一个全局搜索

为了保险一点,可以在 DevEco Studio 里全局搜一下这些关键词:

TelephonyKit
CellularCall
callManager
Telephony
电话
通话

看看是不是:

  • 代码里直接写了相关调用

  • 某个 HAR/HSP/三方依赖间接带进来的

  • 工程模板里默认引入了某些不需要的能力


七、排查这类问题的思路总结

以后再遇到这种错误,不要只盯着错误码 00401004

更应该重点关注:

  • 报错里有没有出现 SystemCapability.xxx

  • 到底是哪个 SysCap 缺失

  • 这个能力是不是当前设备本来就不支持

  • 如果应用没用到,能不能通过 syscap.json 去掉

这类问题,很多时候不是代码 bug,而是 能力声明和目标设备不匹配


八、最终结论

这次 DevEco Studio 报错 00401004,表面上看像是 API version 问题,实际上是:

应用要求了 SystemCapability.Telephony.CellularCall,但当前设备不支持该 SysCap。

如果你的应用并不需要电话/蜂窝通话能力,可以在模块下新增:

entry/src/main/syscap.json

内容如下:

{
"devices": {
"general": [
"default"
]
},
"production": {
"removedSysCaps": [
"SystemCapability.Telephony.CellularCall"
]
}
}

然后重新清理、同步、编译、安装,一般就能解决。



Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐