【问题标题】:PhoneGap not firing deviceready on Android 4.2PhoneGap 未在 Android 4.2 上触发 deviceready
【发布时间】:2026-01-06 01:55:02
【问题描述】:

我在 windows 上使用 create.bat 创建了一个应用程序,并使用 ADT 和最新的 SDK 对其进行了编译。

它会启动并显示cordova 显示屏,但它不会触发deviceready 事件,因为它一直在说“正在连接到设备”。这同样适用于模拟器。但是,当我将模拟器的操作系统更改为 4.0 时,它可以工作。

这正常吗,因为4.2刚刚发布,我要等待更新?

【问题讨论】:

  • 我无法在我的 Mac 上重现此内容。但是,我想我上周在帮助朋友进行设置时看到了类似的问题。我让他在 4.0 模拟器上运行。我会在星期一挖出我的电脑试试看。
  • 啊,嗨,我是来自 google 群组的同一个人。我让它在具有 4.0 的模拟器上工作,但我需要它在具有 4.2 的 Nexus 7 设备上工作。我几乎尝试了所有方法并查看了 logcat 输出。 deviceready 事件永远不会出现。
  • 你能提供一些你的index.html的代码吗???
  • @Dilberted 我正在使用cordova的默认html。
  • 4.2 似乎确实存在某种问题 - 我刚刚将我的应用程序部署到新的 nexus 7 (4.1.1),并且在我安装系统更新之前它工作正常。如果您不喜欢在科尔多瓦内部进行挖掘,您可能需要等待有人进行更新。

标签: android events cordova


【解决方案1】:

我在装有 Android 4.2 的 Nexus 7 上遇到了同样的问题 但是当我将 AndroidManifest targetSdkVersion 更改为“16”时它可以工作

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="16" />   (Before it was ="17")

我希望这对某人有用。

迭戈

【讨论】:

  • 对我的目的来说已经足够了,而且比其他答案容易得多。
  • 一个字符修复!为我工作 +1
  • 我现在使用的是 Phonegap 2.8.1,但仍然遇到此问题。太糟糕了!更改目标似乎对我不起作用。
【解决方案2】:

现在是凌晨 1 点,我终于可以再次运行我的应用程序了。 Android 4.2 包含对 webView.addJavascriptInterface 的一些明显与安全相关的更改,这会阻止默认桥接模式工作。

我希望在下一个版本中会有更好的修复,但如果您需要快速修复,请尝试对 CordovaWebView.exposeJsInterface 进行此更新

private void exposeJsInterface() {
    int SDK_INT = Build.VERSION.SDK_INT;
    boolean isHoneycomb = (SDK_INT >= Build.VERSION_CODES.HONEYCOMB && SDK_INT <= Build.VERSION_CODES.HONEYCOMB_MR2);
    if (isHoneycomb || (SDK_INT < Build.VERSION_CODES.GINGERBREAD)) {
        Log.i(TAG, "Disabled addJavascriptInterface() bridge since Android version is old.");
        // Bug being that Java Strings do not get converted to JS strings automatically.
        // This isn't hard to work-around on the JS side, but it's easier to just
        // use the prompt bridge instead.
        return;            
    } else if (SDK_INT < Build.VERSION_CODES.HONEYCOMB && Build.MANUFACTURER.equals("unknown")) {
        // addJavascriptInterface crashes on the 2.3 emulator.
        Log.i(TAG, "Disabled addJavascriptInterface() bridge callback due to a bug on the 2.3 emulator");
        return;

    } else if (SDK_INT == Build.VERSION_CODES.JELLY_BEAN_MR1) {            
        Log.i(TAG, "Disabled addJavascriptInterface() bridge callback for 4.2");
        return;


    }
    this.addJavascriptInterface(exposedJsApi, "_cordovaNative");
}

【讨论】:

  • 太棒了,它有效!这是工作的 cordova.jar 以节省一些人的时间:dl.dropbox.com/u/14645664/cordova-2.2.0.jar
  • 你们太棒了!谢谢!
  • 我在这上面花了好几个小时,真是救命啊
  • Tom Clarkson 和@elias94xx 非常感谢大家!!!我有一整天的错误——Uncaught TypeError: Object # has no method 'exec'——只是因为 deviceReady 函数没有被触发,我没有注意到这一点。竖起大拇指!!
【解决方案3】:

在我的例子中,自动生成的 index.html 指的是 phonegap.js

所以而不是

<script type="text/javascript" src="phonegap.js"></script>

我放了

<script type="text/javascript" src="cordova.js"></script>

【讨论】:

  • 同样的问题发生在我身上。看来,我使用“phonegap create”创建项目,而不是“cordova create”
  • 如果您在构建过程中阅读警告说明,您会注意到建议您使用 cordova.js 的消息。
【解决方案4】:

显然这是在Phonegap 2.3.0 中修复的。

在Android 4.2上也遇到了这个问题,我的项目是用Phonegap 2.2的。

simple upgrade procedure 之后更新 - 问题已解决。

因此,升级到2.3.0后,再次设置android:targetSdkVersion="17"就可以了。

【讨论】:

    【解决方案5】:

    另一个原因是您的 cordova-2.3.0.jar 可能与 cordova-2.3.0.js 文件版本不匹配。

    【讨论】:

      【解决方案6】:

      我通过删除 js 文件 (Index.js) 中的任何错误解决了我的问题。

      您必须确保您的 javascript 没有任何错误。

      【讨论】: