You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular6 + Cordova 问题:cordova未加载,deviceready事件未触发

解决Cordova deviceready事件未触发导致API无法加载的问题

你遇到的核心问题是deviceready事件完全未触发,这直接导致Cordova API无法初始化,依赖navigator.mediaDevices的组件自然失效。结合你的代码和操作步骤,我整理了几个关键排查点和修复方案:


1. 紧急修复:修正cordova.js引入的语法错误

看你index.html里的脚本引入代码:

<script src=”cordova.js”></script>

这里用了中文全角引号,浏览器根本无法识别这个路径,直接导致cordova.js加载失败,deviceready事件自然不会触发。立刻改成英文半角引号:

<script src="cordova.js"></script>

2. 确保Cordova核心文件存在于www目录

你执行了rm -rf cordova/www/*清空目录,再把Angular构建产物放进去,但Cordova的cordova.js是在cordova prepare阶段才会复制到www根目录的。建议调整你的构建流程:

npm install -g cordova
cordova create cordova
cd cordova && cordova platforms add android
# 先执行prepare生成cordova核心文件
cordova prepare android
# 再清空并复制Angular产物
rm -rf cordova/www/*
ng build --prod --aot --output-path=cordova/www
# 最后构建安卓应用
cd cordova && cordova build android

3. 优化deviceready事件绑定时机

你的事件绑定代码没问题,但可以把它放在DOM加载完成后执行,同时建议将Angular的启动逻辑也延迟到deviceready之后,彻底避免时序问题:

修改index.html的事件绑定

<base href="./">
<script src="cordova.js"></script>
<script>
window.isready = false;
// 先等DOM加载完成再绑定deviceready
document.addEventListener('DOMContentLoaded', function() {
    document.addEventListener('deviceready', ready, false);
});
function ready(){
 alert('deviceready触发成功!');
 console.log('deviceready触发成功!');
 window.isready = true;
}
</script>

修改Angular的main.ts(关键)

把Angular应用的启动逻辑放在deviceready事件回调里,确保Cordova API完全初始化后再启动应用:

import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app/app.module';

document.addEventListener('deviceready', () => {
  platformBrowserDynamic().bootstrapModule(AppModule)
    .catch(err => console.error(err));
}, false);

4. 检查Cordova版本兼容性

你使用的cordova-android@7.0.0版本较旧,可能和新版本插件、Angular存在兼容性问题。建议升级到更稳定的版本:

# 移除旧平台
cordova platform remove android
# 添加9.x稳定版(适配大多数插件)
cordova platform add android@9.1.0

5. 确认白名单配置

虽然你安装了cordova-plugin-whitelist,但要确保config.xml里有正确的白名单规则:

<access origin="*" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-navigation href="*" />

完成以上调整后,重新构建并测试应用,deviceready事件应该能正常触发,navigator.mediaDevices相关功能也会恢复正常。

内容的提问来源于stack exchange,提问作者dc-p8

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:05:53