12

我第一次尝试 Apache Cordova 3.0。

下载了 lib,解压了 cordova-android 和 cordova-js 并创建了一个项目:

./create ~/Documents/andriod-projects/HelloWorld com.x.HelloWorld HelloWorld
- OK

res/xml/config.xml

<plugin name="NetworkStatus" value="org.apache.cordova.NetworkManager" />

AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

在 index.js 设备上准备就绪:

bindEvents: function() {
    document.addEventListener('deviceready', this.onDeviceReady, false);
},

onDeviceReady: function() {

    var networkState = navigator.connection.type;

    var states = {};
    states[Connection.UNKNOWN]  = 'Unknown connection';
    states[Connection.ETHERNET] = 'Ethernet connection';
    states[Connection.WIFI]     = 'WiFi connection';
    states[Connection.CELL_2G]  = 'Cell 2G connection';
    states[Connection.CELL_3G]  = 'Cell 3G connection';
    states[Connection.CELL_4G]  = 'Cell 4G connection';
    states[Connection.CELL]     = 'Cell generic connection';
    states[Connection.NONE]     = 'No network connection';

    alert("Network: "+states[networkState]);
}

当我在我的安卓上模拟项目时,我进入了 LogCat Error:Connection is not defined

在此处输入图像描述

我错过了什么?我必须附加一个 .js 才能声明 Connection?

4

14 回答 14

12

未捕获的引用错误:未定义连接

与缺少“连接”对象有关,根据我对 corodva 3.1.0 的经验,即使按照 benka 建议的延迟,该对象也不可用。这个特定问题可以通过使用 navigator.connection 对象的常量来解决,如下所示:

var states = {};
states[navigator.connection.UNKNOWN]  = 'Unknown connection';
states[navigator.connection.ETHERNET] = 'Ethernet connection';
states[navigator.connection.WIFI]     = 'WiFi connection';
states[navigator.connection.CELL_2G]  = 'Cell 2G connection';
states[navigator.connection.CELL_3G]  = 'Cell 3G connection';
states[navigator.connection.CELL_4G]  = 'Cell 4G connection';
states[navigator.connection.CELL]     = 'Cell generic connection';
states[navigator.connection.NONE]     = 'No network connection';

不幸的是,在我的情况下,这只是 android 上网络状态问题的开始,因为

navigator.connection.type

将始终返回 0,即未知连接。在 android 模拟器和设备上。对我有用的解决方法是直接调用插件类:

document.addEventListener("deviceready", onDeviceReady, false);
function onDeviceReady() {
    var conn = checkConnection();
    alert("Connection:"+conn);


}
function checkConnection(){
        var networkState;
        var test = cordova.exec(
                function(winParam) {networkState = winParam;},
                function(error) {alert("Network Manager error: "+error);},
                "NetworkStatus",
                "getConnectionInfo",
                []
        );
        return networkState;
}

此代码在函数内部有一个丑陋的 networkState 分配,该函数可能在 checkConnection return 语句之后异步执行,但由于本机代码在执行函数内部返回 PluginResult - 这是有效的。返回的 networkState 值与 navigator.connection 不匹配。常量如:

navigator.connection.WIFI

您可以在此处查看插件源代码中返回的值:https ://github.com/apache/cordova-plugin-network-information/blob/master/src/android/NetworkManager.java

于 2013-11-10T20:37:14.113 回答
7

我在Android 4.2.2 Api 17上遇到了与Phonegap 3.0相同的问题。

尝试删除并重新安装 Connection 插件,尝试两个命令:Cordova 或 Phonegap local,但没有工作。

我在日志中注意到的是错误消息之后的以下内容:

10-11 14:31:40.360: E/Web Console(): Uncaught ReferenceError: Connection is not defined
10-11 14:31:40.380: D/CordovaNetworkManager(): Connection Type: wifi

所以我认为它实际上看起来像是从CordovaNetworkManager()成功初始化 Connection.type 后的异步回调,但它不应该是。

所以我尝试了以下方法:

var networkState = navigator.connection.type;

setTimeout(function(){
    networkState = navigator.connection.type;
    alert('networkState = '+networkState);

    var states = {};
    states[Connection.UNKNOWN]  = 'Unknown connection';
    states[Connection.ETHERNET] = 'Ethernet connection';
    states[Connection.WIFI]     = 'WiFi connection';
    states[Connection.CELL_2G]  = 'Cell 2G connection';
    states[Connection.CELL_3G]  = 'Cell 3G connection';
    states[Connection.CELL_4G]  = 'Cell 4G connection';
    states[Connection.CELL]     = 'Cell generic connection';
    states[Connection.NONE]     = 'No network connection';

    alert('Connection type: ' + states[networkState]);
 }, 500);

我知道它看起来有点愚蠢,但每次都有效。它所做的是首先调用navigator.connection.type ,然后在500 毫秒后运行整个函数,给CordovaNetworkManager时间来初始化connection.type

于 2013-10-11T13:51:29.627 回答
6

我有同样的问题,但能够解决它。根据 Phonegap Connection 文档运行以下命令似乎不起作用:

$ cordova plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-network-information.git
$ cordova plugin rm org.apache.cordova.core.network-information

相反,我不得不使用:

$ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-network-information.git

一旦我这样做了,它就起作用了。

于 2013-08-09T05:34:58.253 回答
5

如果您已包含插件并且遇到相同的问题,则可能是您包含插件的顺序。

为了使插件工作,我必须在添加平台后包含插件。

$ cordova create

$ cordova platform add android 

$ cordova plugin add org.apache.cordova.network-information
于 2013-10-02T21:29:37.340 回答
4

我解决了:

$ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-network-information.git
于 2013-10-03T20:53:18.757 回答
1

我正在使用 cordova 3.4.1 添加插件org.apache.cordova.network-information它解决了我的问题,试试这个:

cordova 插件添加 org.apache.cordova.network-information

正如帮助中所说,我没有更改代码的任何部分:

https://github.com/apache/cordova-plugin-network-information/blob/master/doc/index.md

于 2014-05-19T12:35:18.037 回答
0

我一直在使用PhoneGap 3.5.0:navigator.connection.type returned me0 (unknown connection) andnavigator.onLine (from HTML5) wastrue` 时遇到同样的问题。

问题是由手机引起的(可能我的手机上的 Android 版本太旧),因为它可以正确地与模拟器和平板电脑(Android 4.2 在哪里)一起使用 :-(

于 2015-03-10T13:39:26.507 回答
0

我正在玩同样的事情,我认为您需要使用此页面通过使用 cordova CLI 安装功能。

于 2013-07-21T04:40:20.077 回答
0

对我来说,这是因为我在 $(function(){}) 中调用了 checkConnection()。它应该被调用

document.addEventListener("deviceready", function(){
    checkConnection();
});
于 2014-07-18T06:39:21.863 回答
0

我在使用 Cordova 3.5.0 时遇到了同样的问题:一直navigator.connection.type返回0并且navigator.onLinetrue. 这很令人沮丧。

然后我发现问题只出在我的手机上(Android 2.3),它适用于模拟器。

我想这个问题也可能与 Android 版本有关。

于 2015-02-27T08:39:45.493 回答
0

对我来说,添加插件还不够,也没有解决我的问题......

然后我在添加插件后在 CLI 中做了

$ cordova build

一切都很完美!确保您的 /www 文件具有更新的文件,因为它将用于擦除平台/xxx/www 文件

于 2014-01-03T15:22:55.287 回答
0

现在似乎在科尔多瓦 3.5 的日子

<access origin="*" />

是正确的 CORS config.xml 条目。

请注意澄清它是“ORIGIN”而不是“uri”和“子域”,就像我之前相信的那样。

于 2014-09-05T23:35:49.640 回答
0

最后几乎同时没有加载引用的 js 插件。科尔多瓦插件.js

您的项目可能不在正确的文件夹中......但无论如何您都可以直接复制到已知的文件夹中。

         资产 / www / plugins / org.apache.cordova.network-information

      网络.js“

      连接.js"

并加载到您的 html 中

于 2014-04-03T21:48:54.680 回答
0

我面临同样的问题,搜索这个问题我发现了这个问题。我尝试了很多想法,但一个确实有效的是:1-卸载网络信息插件 2-在 CMD -> cordova build 3-再次安装插件 4-再次构建。

在此之后连接示例工作正常。

于 2014-02-06T06:00:52.360 回答