2014-04-04 16 views
9

Sorun açıklaması: Dahili depolamaya dosya veya dosya sistemi kökleriyle (okuma ve yazma) erişebilirim. Ancak böyle bir dosya başka bir uygulamadan erişilemez. Örneğin bu dosyayı emailComposerPlugin aracılığıyla göndermek istersem, dosyaya e-posta istemcisi tarafından erişilemez. (Aynı şey "open with" işlevi için de geçerli.) {sandboxed: true} seçeneklerini false (external storage'a yazmak için) olarak değiştirirseniz, çalışmaz ve FileUtils.UNKNOWN_ERR dosyasında biter. Bazı dokümanlar bilgisayar üzerine monte edilirken harici depolama erişilemediğini belirtti, ancak aynı sonucu olsa da, telefon USB bağlantısı kesilirken uygulamayı denedim.Cordova dosya/dosya sistemi kökleri eklentileri ile harici depolama nasıl erişilir?

mailing list'da okuduğumdan bu mümkün olmalıdır. Önemli bir noktayı özledim mi?

Bağlam: Android aygıtlarda çalışabilmesi için iPhone için oluşturulan bir karma uygulamayı etkinleştirmeyi deniyorum. Küçük bir oyun alanına sahip olmak için küçük bir test projesi yapıyorum.

Düzenleme: Dosya sistemi kökleri ve dosya eklentisi arasında bir sorun var gibi görünüyor. Ama ikisinin de en yeni versiyonları var. (Dosya: 1.0.1 Dosya-sistemi-kökleri: 0.1.0) dosya sistemi ve dosya sınıfları

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 

Ne denedi olduğunu göstermektedir ayıklama?

i anladım tüm bu konuya bakıyor biraz kazma sonra javascript kodu

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

cevap

13

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" /> 

:

  • Dosya sistemi kökleri eklentisine gerek yoktur.
  • config.xml dosyasında daha fazla yapılandırma gereklidir.
  • Standart FileApi yolunu kullanmanız gerekmez, ancak dosyalara erişmek için aşağıdakiler gerekir.

JavaScript kullanımı:

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

harici sd kart için yazma yeni dosyanın tam çalışma örneği verebilir misiniz? –

+1

Bu kodu kullanarak bittim: window.resolveLocalFileSystemURL ('dosya: /// storage/extSdCard /', işlev (fs) {var nativePath = fs.toURL(); alert (nativePath);}, işlev (err) {alert (err);}); ' –

+0

Sorunumun ne kadar benzer olduğundan emin değil. Ancak AndroidPersistentFileLocation uyumluluğuna sahip olmak, sorunu cordova v5 + –

5

mücadele saat sonra nihayet sdcard taramak açabiliyorum ve "files: // pat" gibi bir dizin sağlayarak dosyalara erişme htofile /".
Ben bir API ve örnek bir proje API kaynak kodu

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

Düzenlemesi

API

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

kullanmanın https://github.com/xjxxjx1017/cordova-phonegap-android-sdcard-full-external-storage-access-library

Örnek göndermek ettik

  • Config.xml
    silme tercihi: tercih adı = "AndroidExtraFilesystems"

  • emin bir test ortamı sağlamak can erişim o test sırasında kendi harici depolama var. (Eğer usb ile bağlamak eğer ep, bir kamera olarak bağlandığından emin olun, "deviceready" olayı recieving sonra API'leri Çağrı)

Yol örnek:
file: ///
file: /// somefile/
file: /// somefile
dosyası: ///somefile/music/aaaaa.mp3

+0

için bir dosya sistemi ile çözdü ve bir mp3 için üretilen url'yi cordova-plugin-media örneğine gönderdim. Eklenti oynamadı. Dosyanın gerçek URI'si üzerinde bir fark var mı? – arjun

İlgili konular