PhoneGap在Android 4.2上无法触发deviceready事件

27

我使用Windows上的create.bat创建了一个应用,并使用ADT和最新的SDK进行了编译。

它启动并显示Cordova界面,但它无法触发deviceready事件,因为它一直显示“连接设备”。对于模拟器也是如此。但是,当我将模拟器的操作系统更改为4.0时,它可以工作。

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


我在我的 Mac 上无法重现这个问题。不过,上周我在帮助朋友设置时看到了一个类似的问题。我让他使用了 4.0 模拟器。我会在周一找出我的 PC 来尝试一下。 - Simon MacDonald
啊嗨,我是来自Google Groups的那个人。我已经在4.0模拟器上让它工作了,但我需要它在我的Nexus 7设备上运行4.2。我尝试了几乎所有的方法,并查看了logcat输出。但deviceready事件从未出现。 - user625860
你能提供一下你的index.html代码吗? - Dilberted
@Dilberted 我正在使用 Cordova 的默认 HTML。 - user625860
似乎4.2版本存在某些问题 - 我刚刚将我的应用部署到新的Nexus 7(4.1.1),在安装系统更新之前一切正常。如果您不熟悉挖掘Cordova内部,您可能需要等待其他人进行更新。 - Tom Clarkson
是的,不幸的是我对Java和Android应用程序的内部结构都很陌生。我希望修复起来不太困难。 - user625860
6个回答

29

我在使用 Android 4.2 版本的 Nexus 7 上遇到了同样的问题,但是当我将 AndroidManifest 的 targetSdkVersion 改为 "16" 后就可以正常工作了。

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

我希望这对某个人有帮助。

迭戈


足以满足我的需求,比另一个答案容易得多。 - Jon Garvin
一个字符修复!对我有用 +1 - Peter Ajtai
我现在使用的是Phonegap 2.8.1,仍然遇到这些问题。太烂了!而且更改目标似乎对我没有用。 - Phương Nguyễn

17

现在是凌晨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");
}

8
太棒了,它可用!这是一个可工作的cordova.jar文件,能够节省一些人的时间:https://dl.dropbox.com/u/14645664/cordova-2.2.0.jar - user625860
你们太棒了!谢谢! - ezekielDFM
我已经花了好几个小时在这上面,真是救命稻草。 - Mike
Tom Clarkson和@elias94xx,非常感谢你们!!!我整天都在遇到一个错误--Uncaught TypeError: Object #<Object> has no method 'exec'--只是因为deviceReady函数没有被触发,而我没有注意到。大大的赞!! - Yves

9
在我的情况下,自动生成的index.html引用了phonegap.js。因此,应该使用:
<script type="text/javascript" src="phonegap.js"></script>

I put

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

1
我也遇到了同样的问题。看起来是因为我使用了“phonegap create”而不是“cordova create”创建了项目。 - Halil
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Denis Besic

2
显然,在 Phonegap 2.3.0 中已经修复了这个问题。
我在 Android 4.2 上也遇到了这个问题,我的项目当时使用的是 Phonegap 2.2。
按照这个 简单的升级程序 进行更新 - 问题得到解决。
因此,在升级到 2.3.0 后,再次设置 android:targetSdkVersion="17" 是可以的。

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

0

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

你必须确保你的JavaScript没有任何错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接