Aprende a lidiar con un directorio nativo (content:// en vez de file://) y a conocer la causa del problema.

Cómo resolver directorio nativo de archivo en Android (content://) si resolveLocalFileSystemURL no funciona

Usando el típico lector de archivos (file plugin) de cordova, podrás leer un archivo con su dirección completa, por ejemplo el archivo con el siguiente directorio "file://storage/etc/etc.txt" podria ser leído usando el siguiente código:

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
   });
}

Sin embargo, con las versiones de Android 4.4 o superiores, se introdujo MediaStore. Este manager contiene meta información para todo el contenido tanto externo como interno del dispositivo y retorna una URL con el formato: content://.

Luego, si tu explorador de archivos (sea como lo tengas, autoimplementado o un plugin), el directorio de un archivo podría ser similar a content://com.google.android.apps.photos.contentprovider/0/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F63131 en vez de file:///path/to/myfile/. Por lo tanto, usando el método resolveLocalFileSystemURL no podrás acceder al archivo.

Este es un problema muy conocido en Android V4.4 o superior, por lo tanto alguien ha escrito un plugin para resolver el problema, simplemente sigue los siguientes pasos.

Instala cordova-plugin-filepath en tu proyecto ejecutando el siguiente comando en la línea de comandos:

$ cordova plugin add cordova-plugin-filepath

Ahora, debes usar window.FilePath.resolveNativePath. para convertir la URL con formato content:// en file:// para despues usar  window.resolveLocalFileSystemURL si quieres leer un archivo.

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 !
       });
    }
} 

La URI de formato content:// será procesada y retornara el directorio original, de esta manera podrás leer el archivo usando resolveLocalFileSystemURL con un directorio file:// . Puedes leer más acerca de este plugin en su repositorio oficial aquí.

Que te diviertas !


Ingeniero de Software Senior en EPAM Anywhere. Interesado en la programación desde los 14 años, Carlos es un programador autodidacta, fundador y autor de la mayoría de los artículos de Our Code World.

Conviertete en un programador más sociable

Patrocinadores