【问题标题】:Getting chrome.socket plugin example to run under Cordova获取 chrome.socket 插件示例以在 Cordova 下运行
【发布时间】:2014-08-08 03:17:40
【问题描述】:

我正在尝试从这个问题的示例到在 Android 平板电脑上工作。

Cordova chrome.socket API. Any example?

这个例子失败了,我相信这是因为 manifest.json 文件中的网络权限没有设置。

我的问题是它属于哪里,或者我在哪里放置这些权限。

感谢您的帮助。

杰克

【问题讨论】:

  • 您是在一个纯 Cordova 应用程序中尝试这个吗?或者您正在尝试构建基于 Cordova 的 CCA 应用程序?
  • 这是一个 Cordova 解决方案

标签: cordova google-chrome-app


【解决方案1】:

对于 Cordova 应用程序,您不需要任何特殊的清单权限。只要您在答案中使用示例代码(不是问题;))

我知道 Cordova 应用程序的唯一警告是,您需要在 chrome.socket API 可用之前明确等待“deviceready”事件。

我刚刚用这个 JS 进行了测试,我的设备 (Nexus 7) 连接到 Yahoo 并下载主页的前一千字节,并将其记录到控制台。

function stringToArrayBuffer(string) {
    var buffer = new ArrayBuffer(string.length);
    var bufView = new Uint8Array(buffer);
    for (var i=0; i < string.length; i++) {
        bufView[i] = string.charCodeAt(i);
    }
    return buffer;
}

function arrayBufferToString(buffer) {
    return String.fromCharCode.apply(null, new Uint8Array(buffer));
}

// Set the hostname; we'll need it for the HTTP request as well
var hostname = "www.yahoo.com";

document.addEventListener('deviceready', function() {
    chrome.socket.create("tcp", function(createInfo) {
        var socketId = createInfo.socketId;
        chrome.socket.connect(socketId, hostname, 80, function(result) {
            if (result === 0) {
                var requestString = "GET / HTTP/1.1\r\nHost: "+hostname+"\r\nConnection: close\r\n\r\n";
                var requestBuffer = stringToArrayBuffer(requestString);
                chrome.socket.write(socketId, requestBuffer, function(writeInfo) {
                    chrome.socket.read(socketId, 1000, function(readInfo) {
                        var htmlString = arrayBufferToString(readInfo.data);
                        // do something with htmlString here
                        console.log(htmlString);
                    });
                });
            }
        });
    });
}, false);

【讨论】:

  • 这是一个在三星 Tab 3 上运行的离子应用程序。它是 Android 版本 4.1.2。那是我的问题吗?我从一个未修改的 ionic todo 应用程序开始,并添加了“chrome.sockets”插件。我总是从-1000 的连接中得到一个返回值。它是在调用设备就绪事件之后。
  • 这原来是由“android.os.NetworkOnMainThreadException”引起的。我在 $ionicPlatform.ready 事件上进行了尝试,它仍然引发了这个异常。任何想法为什么它可以在您的设备上运行(除了它可能不是标志性应用程序)
  • 这可能是 4.1 的差异——我很确定我们已经测试了 4.0.4 的套接字,但我会看看是否可以在 4.1.2 上尝试。您能否为您的问题添加回溯,以便我可以查看异常发生的位置>
  • 最后,我将 ChromeSocket.java 中的执行函数的内容包裹在了 cordova.getThreadPool().execute(...) 中,并且成功了。
  • 这就是这样做的方法;我只是希望得到一个错误报告,看看哪些方法导致了问题。谢谢。
猜你喜欢
  • 1970-01-01
  • 2018-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多