【问题标题】:TypedArray as Cordova plugin parameterTypedArray 作为 Cordova 插件参数
【发布时间】:2014-07-24 11:41:49
【问题描述】:

我正在为 Cordova 3.3 开发一个插件。

在我的 javascript 部分,我正在下载一个存储为 uInt8Array 的 pdf 文件。

download: function ( ) {
        var xhr = new XMLHttpRequest();
        xhr.open('GET', 'url/to/pdf', true);
        xhr.responseType = 'arraybuffer';
        xhr.setRequestHeader('Accept', 'application/pdf');

        xhr.onload = function(e) {
            var uInt8Array = new Uint8Array(this.response); 

            window.plugins.filedownloader.saveFile(
                uInt8Array,
                "Downloads",
                function ( response ) {
                    console.log("success");
                },
                function ( response ) {
                    console.log("failure");
                }
            );
        };

        xhr.send();
    },

我将 uInt8Array 提交给我的 cordova 插件的保存方法。 我的插件的 javascript 部分如下所示:

var exec = require('cordova/exec');

function FileDownloader() {
};

FileDownloader.prototype = {
    login: function ( loginUrl, params, username, password, successCallback, failureCallback ) {
        exec( successCallback, failureCallback, "FileDownloader", "doLogin", [ loginUrl, params, username, password ] );
    },

    getHtmlPage: function ( url, successCallback, failureCallback ) {
        exec( successCallback, failureCallback, "FileDownloader", "getHtmlPage", [ url ] );
    },

    downloadAndSaveFile: function ( url, saveFolder, successCallback, failureCallback ) {
        exec( successCallback, failureCallback, "FileDownloader", "downloadAndSaveFile", [ url, saveFolder ] );
    },

    saveFile: function ( data, saveFolder, successCallback, failureCallback ) {
       exec( successCallback, failureCallback, "FileDownloader", "saveFile", [ data, saveFolder ] );  
    }
};

FileDownloader.install = function () {
    if (!window.plugins) {
        window.plugins = {}
    }

    window.plugins.filedownloader = new FileDownloader();
    return window.plugins.filedownloader;
};

cordova.addConstructor(FileDownloader.install);

java部分的save方法如下:

public PluginResult execute(JSONArray args) {
                PluginResult result = new PluginResult(PluginResult.Status.OK, "blub");
                log("saveFile");

               try{
                   JSONObject dataValues = args.getJSONObject(0);
                } catch (JSONException e) {
                    e.printStackTrace();
                }

                return result;
            }

我现在的问题是,typedArray 不再是数组了。它是一个 JSONObject。 uInt8Array 的索引现在是字符串,不再排序。此外,至少还有一个新键“byteBuffer”。

有没有办法在将 typedArray 移交给插件的 java 部分时将其视为 JSONArray,或者是否有不同的方法来处理这个问题?

【问题讨论】:

    标签: java javascript cordova sencha-touch typed-arrays


    【解决方案1】:

    有更好的方法。

    由于我使用的是 Sencha Touch,我不需要自己创建 xhr 对象。 实际上,就像问题中所做的那样,它会导致 ios 中的内存问题,并且应用程序会因文件较大而崩溃。

    Ext.Ajax.request() 有一个未记录的选项 responseType 可用于获取数组缓冲区。

    downloadFile: function ( record ) {
        var me = this;
        Ext.Ajax.request({
            url: record.get("url"),
            method: 'GET',
            success: function ( response ) {
                me.onFileDownloaded( response, record );
            },
            failure: function ( response ) {
            },
            scope: this,
            responseType: "arraybuffer",
            timeout: 300000
        });
    

    这个请求的响应是一个arraybuffer,可以这样使用:

    window.plugins.filemanager.saveUint8ByteArrayToFile(
                "Download",
                record.get("title"),
                response.responseBytes,
                response.responseBytes.byteLength,
                function ( filePath ) {
                    me.onFileSaved( filePath );
                },
                function ( message ) {
                    me.onFileSaveError( message );
                }
            );
    

    在 Android 上,response.responseBytes 将被转换为 base64 编码的字符串。在 iOS 上它将被转换为 NSData。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-05
      • 2014-12-26
      • 2011-11-20
      • 2014-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-07
      相关资源
      最近更新 更多