在cordova中, 你实际上可以使用cordova文件插件轻松读取具有给定路径的android文件(file://storage/etc/etc.txt), 例如:
var path = "file:///path/to/myfile/";
window.resolveLocalFileSystemURL(path, success, fail);
function fail(e) {
console.error(e);
}
function success(fileEntry) {
fileEntry.file(function(file) {
var reader = new FileReader();
reader.onloadend = function(e) {
var content = this.result;
console.log(content);
};
reader.readAsText(file); // or the way you want to read it
});
}
但是, 在Android版本> = 4.4中引入了MediaStore。媒体提供程序包含内部和外部存储设备上所有可用媒体的元数据, 并返回content:// URI。
然后, 如果你的文件浏览器提供了Android的本地uri内容, 则类似于:content://com.google.android.apps.photos.contentprovider/0/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F63131而不是file:/// path / to / myfile /, 你将无法检索上一个路径的文件条目, 因为cordova文件插件需要绝对的文件路径。
这是android> = 4.4路径的一个众所周知的问题, 因此有人刚刚编写了一个插件来解决此问题, 你可以使用以下解决方案。
在命令提示符中使用以下命令下载cordova-plugin-filepath:
$ cordova plugin add cordova-plugin-filepath
然后使用以下代码来解决:
var uripath = 'content://com.google.android.apps.photos.contentprovider/0/1/content......';
window.FilePath.resolveNativePath(uripath, successNative, failNative);
function failNative(e) {
console.error('Houston, we have a big problem :(');
}
function successNative(finalPath) {
var path = 'file://'+ finalPath;
window.resolveLocalFileSystemURL(path, success, fail);
function fail(e) {
console.error(e);
}
function success(fileEntry) {
fileEntry.file(function(file) {
var reader = new FileReader();
reader.onloadend = function(e) {
var content = this.result;
console.log(content);
};
reader.readAsText(file); // Finally !
});
}
}
内容uri将由使用window.FilePath.resolveNativePath的此插件解析, 并且将检索本机文件路径, 使用此文件, 你可以使用resolveDataFileURL毫无问题地读取文件。
你可以在此处阅读有关此插件的更多信息。
选项2
使用生成file://路径样式而不是URI的插件。 ourcodeworld-cordova-filebrowser插件是适用于Android的NoNonsense-FilePicker的cordova实现。该插件允许你选择文件夹和文件, 同时创建文件夹和创建文件(实际上不是创建文件, 但是它将返回文件路径和”选择的路径”的名称)。
在命令提示符处执行以下命令, 将此插件添加到你的项目中:
cordova plugin add https://github.com/ourcodeworld/cordova-ourcodeworld-filebrowser.git
并启动一个文件选择器来测试插件:
// Single file selector
window.OurCodeWorld.Filebrowser.filePicker.single({
success: function(data){
if(!data.length){
// No file selected
return;
}
// Array with filepaths
// ["file:///storage/emulated/0/360/security/file.txt", "file:///storage/emulated/0/360/security/another-file.txt"]
}, error: function(err){
console.log(err);
}
});
请注意, 该插件可以在垂直和水平方向上工作, 并且cordova的文件插件可以读取文件路径。
在官方文档或github存储库中了解有关此插件的更多信息。
玩得开心