2014-04-04 11 views
9

Descrizione del problema: Posso accedere alla memoria interna con il file o il file system-roots (leggi e scrivi). Ma un file di questo tipo non può accedere da un'altra app. Ad esempio, se desidero inviare questo file tramite emailComposerPlugin, non è possibile accedere al file dal client di posta elettronica. (Lo stesso vale per la funzione "Apri con".) Se cambio le opzioni {sandboxed: true} su false (per scrivere nella memoria esterna), non funziona e finisce in un FileUtils.UNKNOWN_ERR. Ho provato l'applicazione mentre il telefono si disconnetteva dalla porta USB, in quanto alcuni documenti menzionavano l'impossibilità di accedere alla memoria esterna mentre erano montati sul PC - lo stesso risultato però.Come accedere alla memoria esterna con i file cordova/file-system-roots?

Da quello che ho letto su mailing list questo dovrebbe essere possibile. Sembra che mi manchi un punto cruciale?

Contesto: Si tenta di abilitare un'applicazione ibrida creata per iPhone per l'esecuzione su dispositivi Android. Per avere un piccolo parco giochi, creo un piccolo progetto di test.

Modifica: Sembra esserci un problema tra file-system-roots e plug-in di file. Ma ho le versioni più recenti di entrambi. (file: 1.0.1 File-system-radici: 0.1.0) Debug del file system e le classi di file mostrano che

private String fullPathForLocalURL(Uri URL) { 
    if (FILESYSTEM_PROTOCOL.equals(URL.getScheme()) && "localhost".equals(URL.getHost())) { 
     String path = URL.getPath(); 
     if (URL.getQuery() != null) { 
      path = path + "?" + URL.getQuery(); 
     } 
     return path.substring(path.indexOf('/', 1)); 
     // path = "/cache-external" at this point 
     // results in index out of bounds exception 

Cosa ho provato?

config.xml

<preference name="AndroidExtraFilesystems" value="files,files-external,documents,sdcard,cache,cache-external" /> 

AndroidManifest.xml

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

codice javascript

function createTextDocument(filename, text) { 

    cordova.filesystem.getDirectoryForPurpose('cache', {sandboxed: false}, successCallback, failureCallback); 

    function successCallback(directoryEntry){ 
     console.log('directory found (cordova): ' + directoryEntry.toURL()); 
     console.log('directory found (native) : ' + directoryEntry.toNativeURL()); 
     directoryEntry.getFile(filename, {create: true, exclusive: false}, 
      function(fileEntry){ 
       var filePath = fileEntry.toNativeURL(); 
       fileEntry.createWriter(
        function(fileWriter){ 
         console.log('start writing to: ' + filePath); 
         fileWriter.write(text); 
         console.log('file written'); 
        },failureCallback 
       ); 
      }, failureCallback 
     ); 
    } 

    function failureCallback(error){ 
     console.log('error creating file: ' + error.code); 
     // results in code 1000 
    } 
} 

risposta

13

Dopo aver scavato tutta questa discussione un po ', ho capito:

  • Non è necessario il plug-in root del file system.
  • C'è più configurazione necessaria in config.xml.
  • È necessario utilizzare non il modo standard FileApi, ma quanto segue per accedere ai file. utilizzo

JavaScript:

window.resolveLocalFileSystemURL(path, cbSuccess, cbFail); 

@param path: {string} a cordova path with scheme: 
      'cdvfile://localhost/<file-system-name>/<path-to-file>' 
      Examples: 'cdvfile://localhost/sdcard/path/to/global/file' 
         'cdvfile://localhost/cache/onlyVisibleToTheApp.txt' 
@param cbSuccess: {function} a callback method that receives a DirectoryEntry object. 
@param cbFail: {function} a callback method that receives a FileError object. 

config.xml

<preference name="AndroidPersistentFileLocation" value="Compatibility" /> 
<preference name="AndroidExtraFilesystems" value="sdcard,cache" /> 

AndroidManifest.xml

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
+3

Potete fornire un esempio di lavoro pieno di scrivere nuovi file da sdcard esterno? –

+1

Ho finito per usare questo codice: 'window.resolveLocalFileSystemURL ('file: /// storage/extSdCard /', function (fs) {var nativePath = fs.toURL(); alert (nativePath);}, function (err) {alert (err);}); ' –

+0

Non sono sicuro di quanto il mio problema fosse simile. Ma avendo AndroidPersistentFileLocation per la compatibilità risolto il problema con il file system di Android per cordova v5 + –

5

Dopo ore di lotta, finalmente sono in grado di eseguire la scansione e sdcard ottenere l'accesso ai file fornendo una directory come "file: // pat htofile /".
Ho inviare un'API e un progetto di esempio https://github.com/xjxxjx1017/cordova-phonegap-android-sdcard-full-external-storage-access-library

Esempio di utilizzo delle API

new ExternalStorageSdcardAccess(fileHandler).scanPath("file:///storage/sdcard1/music"); 
function fileHandler(fileEntry) { 
    console.log(fileEntry.name + " | " + fileEntry.toURL()); 
} 

il codice sorgente API

var ExternalStorageSdcardAccess = function (_fileHandler, _errorHandler) { 

    var errorHandler = _errorHandler || _defultErrorHandler; 
    var fileHandler = _fileHandler || _defultFileHandler; 
    var root = "file:///"; 

    return { 
     scanRoot:scanRoot, 
     scanPath:scanPath 
    }; 

    function scanPath(path) { 
     window.resolveLocalFileSystemURL(path, _gotFiles, errorHandler); 
    } 

    function scanRoot() { 
     scanPath(root); 
    } 

function _gotFiles(entry) { 
    // ? Check whether the entry is a file or a directory 
    if (entry.isFile) { 
     // * Handle file 
     fileHandler(entry); 
    } 
    else { 
     // * Scan directory and add media 
     var dirReader = entry.createReader(); 
     dirReader.readEntries(function(entryList) { 
      entryList.forEach(function (entr) { 
       _gotFiles(entr); 
      }); 
     }, errorHandler); 
    } 
} 

    function _defultFileHandler(fileEntry){ 
     console.log("FileEntry: " + fileEntry.name + " | " + fileEntry.fullPath); 
    } 
    function _defultErrorHandler(error){ 
     console.log('File System Error: ' + error.code); 
    } 
}; 

Configurazioni

  • config.xml
    preferenza di eliminazione: name = "preferenza" AndroidExtraFilesystems

  • assicurarsi ambiente di test può accesso il proprio storage esterno al momento del test. (Ep se lo si collega con l'usb, assicurarsi che sia collegato come una macchina fotografica, chiamare le API dopo aver ricevuto l'evento "deviceready")

esempio Percorso: file di
: ///
file: /// somefile/
file: /// somefile
di file: ///somefile/music/aaaaa.mp3

+0

ho inviato l'url generato per un mp3 all'istanza di cordova-plugin-media. Il plugin non ha giocato. C'è una differenza sull'URI effettivo del file? – arjun

Problemi correlati