解决android的本地路径(content://)如果resolveLocalFileSystemURL不工作

在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的文件插件可以读取文件路径。

如果resolveLocalFileSystemURL不起作用,则解决android(content://)的本机路径1

在官方文档或github存储库中了解有关此插件的更多信息。

玩得开心

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?