首先,我想说我的下载文件/打开文件脚本曾经用于较早的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 我尝试对“ 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,但从此位置打开文件:///仍然没有运气
答案是否在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" />
任何见解都会非常有帮助。尽我所能尝试不同的东西。