Cordova / Phonegap保存和打开文件,(无SD卡)。 Android

时间:2018-06-27 17:22:53

标签: android cordova cordova-plugins phonegap-build phonegap

首先,我想说我的下载文件/打开文件脚本曾经用于较早的CLI版本。我可以在iOS上很好地下载和显示文件,而android是问题所在。

我一直在尝试将其修复约6个月(可能更长)。我举起手来寻求帮助,因为我认为我已经用尽了所有选择。这个问题有些冗长,但我想将所有发现和尝试过的内容包括在内。

问题出在没有SD卡的设备上。我可以使用下面的多种功能下载文件,但是无法打开它们。 对于打开文件,我只是将文件发送到navigator.app.loadUrl()。再次,navigator.app.loadUrl在iOS和配备SD卡的android上均可正常运行。我只能假设将路径传递到loadUrl时找不到该文件。

问题1。 对于具有SD卡的设备以及具有内部存储器的设备,fileEntry返回的本机URL是否看起来像这样?

file:///storage/emulated/0/MySubdirectory/myfilename.pdf

当我将“ file:///storage/emulated/0/MySubdirectory/myfilename.pdf”传递给loadURL时,该路径确实存在吗?我可以在设备/ root / sdcard下找到该子目录和文件。如果将此文件写入root / sdcard / MySubdirectory / myfilename.pdf,则如何调用loadURL?

这是从我的控制台日志中获取的fileEntry enter image description here 我尝试对“ file:///root/sdcard/MySubdirectroy/myfilename.pdf”进行硬编码,但浏览器无法打开。 (如果我在我的fileEntry或将在外部浏览器中打开的fileTransfer条目(例如http://www.google.com)中对网站进行硬编码)

下载/打开文件以及我尝试过的操作。

只要有人单击应用程序中的文件链接,就会调用downloadFile()。将为downloadFile传递一个url和一个文件名。 downloadFile(url,fileName)

定义商店 我尝试将cordova-plugin文件中概述的商店更改为各个位置。 applicationDirectory,applicationStorageDirectory,dataDirectory,externalRootDIrectory(仅适用于SD卡)。请在下面查看我的尝试。

尝试1(基本resolveLocalFileSystemURL)

function downloadFile(url, fileName) {
     console.log('started downloadFile');
    //android store information
    store = cordova.file.applicationStorageDirectory;
    //Check for the file. 
    window.resolveLocalFileSystemURL(store+fileName, downloadStart, downloadAsset(url, fileName));

}
    function downloadStart() {
    //console.log('Ready');
}

function downloadAsset(url, fileName) {
    var fileTransfer = new FileTransfer();
    fileTransfer.download(url, store+fileName,
    function (entry) {                 
           openDocument(store+fileName);            
    },
    function (err) {
        console.log('Error: '+ url,store);
        console.log(err);
    });
} //end downloadAsset

//openDocument
function openDocument(url) {
    navigator.app.loadUrl(url, { openExternal: true }); //for android
}

此处的openDocument不会导致打开外部浏览器。该文件的本机路径仍然包含../ emulated /..

尝试2(此操作使用window.requestFileSystem)

function downloadFile(url, fileName) {
    //Check for the file. 
    window.requestFileSystem(
        LocalFileSystem.PERSISTENT,
        0,
        function (fileSystem) {
                var nurl = url;
                dir = fileSystem.root.toURL() + fileName,
                ft = new FileTransfer();

            ft.download(nurl, dir,
                function (fileEntry) {
                    navigator.app.loadUrl(fileEntry.nativeURL,{openExternal:true});
                },
                function (error) {
                    alert('Download error');
                    console.log(dir);
                }
            );
        },
        function (error) {
            alert('Error getting file system');
        }
    );


} //end downloadFile

相同的问题。文件正在保存(可能未保存到正确的位置)。我可以使用文件浏览器类型的应用程序浏览到该文件,但无法打开它。

尝试3.查看文件传输文档,不建议使用XMLHttpRequest。我试过了,但我假设的文件路径仍然是相同的问题。

这是我在此处cordova transition information提供的cordova文档所修补的功能

function downloadFile(url, fileName) {
    var tempURL;
    window.requestFileSystem(LocalFileSystem.TEMPORARY, 0, function (fs) {
        fs.root.getFile(fileName, { create: true, exclusive: false }, function (fileEntry) {
            var oReq = new XMLHttpRequest();
            oReq.open("GET", url, true);
            oReq.responseType = "blob";
            console.log(fileEntry);
            tempURL = fs.root.nativeURL;
            oReq.onload = function (oEvent) {
                var blob = oReq.response; // Note: not oReq.responseText
                console.log("file location: "+tempURL+fileName);
                window.open(tempURL+fileName, "_system");
            };
            oReq.send(null);
        }, function (err) { console.error('error getting file! ' + err); });
    }, function (err) { console.error('error getting persistent fs! ' + err); });

} //end downloadFile

这是我的控制台日志的抓取,显示了本机URL,但从此位置打开文件:///仍然没有运气 enter image description here

答案是否在config.xml中?过时的插件,Android权限? phonegap建议我添加的Extrafilesystems内容?

我已经添加了一些东西,其中有些可能是必要的,也可能不是必需的。可根据要求提供整个config.xml:

<config-file platform="android" parent="/manifest" mode="add">
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.CAMERA" />
    </config-file>  
    <preference name="AndroidExtraFilesystems" value="files,files-external,documents,sdcard,cache" />
    <plugin name="cordova-plugin-file"  spec="~4.1.1" source="npm" />
    <plugin  name="cordova-plugin-file-transfer"  source="npm"  spec="~1.6.3" />
..
...
....

    <allow-navigation href="*" />
    <allow-intent href="*" />
    <access origin="*" />

今天,我更新了config.xml以使用cli-8.0.0,并修改了插件规范

<plugin name="cordova-plugin-file"  />
<plugin name="cordova-plugin-file-transfer"  />

任何见解都会非常有帮助。尽我所能尝试不同的东西。

0 个答案:

没有答案