2014-04-04 8 views
9

समस्या विवरण: मैं फ़ाइल या फ़ाइल-सिस्टम-जड़ों (पढ़ने और लिखने) के साथ आंतरिक संग्रहण तक पहुंच सकता हूं। लेकिन ऐसी फाइल किसी अन्य ऐप से नहीं पहुंच सकती है। उदाहरण के लिए यदि मैं इस फ़ाइल को ईमेलकंपर्स प्लगइन के माध्यम से भेजना चाहता हूं, तो फ़ाइल को ईमेल क्लाइंट द्वारा एक्सेस नहीं किया जा सकता है। (समान "फंक्शन के साथ" फंक्शन के लिए जाता है।) यदि मैं {sandboxed: true} को गलत (बाहरी स्टोरेज को लिखने के लिए) विकल्प बदलता हूं, तो यह फ़ाइलUtils.UNKNOWN_ERR में काम नहीं करता है और समाप्त होता है। मैंने यूएसबी से डिस्कनेक्ट होने पर एप्लिकेशन को आजमाया, क्योंकि कुछ दस्तावेज़ों ने उल्लेख किया कि पीसी पर घुड़सवार होने पर बाह्य भंडारण तक पहुंचा नहीं जा सकता है।कॉर्डोवा फ़ाइल/फ़ाइल-सिस्टम-रूट प्लगइन्स के साथ बाहरी संग्रहण तक कैसे पहुंचे?

जो मैंने mailing list पर पढ़ा है उससे यह संभव होना चाहिए। ऐसा लगता है कि मुझे एक महत्वपूर्ण बिंदु याद आती है?

प्रसंग: मैं android उपकरणों पर चलने के लिए iPhone के लिए बनाई गई एक संकर आवेदन सक्षम करने के लिए प्रयास करें। थोड़ा खेल का मैदान बनाने के लिए, मैं एक छोटी परीक्षा परियोजना बनाते हैं।

संपादित करें: फ़ाइल-सिस्टम-जड़ों और फ़ाइल प्लगइन के बीच एक समस्या प्रतीत होती है। लेकिन मेरे पास दोनों के नवीनतम संस्करण हैं। (फ़ाइल: 1.0.1 फ़ाइल-सिस्टम-जड़ों: 0.1.0) डिबगिंग फ़ाइल-प्रणाली और फ़ाइल कक्षाओं पता चलता है कि

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 

मैं क्या कोशिश की है?

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

जावास्क्रिप्ट कोड

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

उत्तर

13

इस पूरे विषय को काफ़ी खुदाई के बाद, मैं पता लगा:

  • फ़ाइल सिस्टम रूट प्लगइन की कोई आवश्यकता नहीं है।
  • config.xml में और अधिक विन्यास की आवश्यकता है।
  • आपको मानक फ़ाइलएपीआई तरीके से उपयोग करने की आवश्यकता नहीं है, लेकिन फ़ाइलों तक पहुंचने के लिए निम्न का उपयोग करना होगा।

जावास्क्रिप्ट उपयोग:

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

आप बाहरी sdcard के लिए लिखने नई फ़ाइल की एक पूरी काम कर उदाहरण दे सकते हैं? –

+1

मैं इस कोड का उपयोग कर समाप्त हुआ: 'window.resolveLocalFileSystemURL ('फ़ाइल: /// स्टोरेज/extSdCard /', फ़ंक्शन (एफएस) {var nativePath = fs.toURL(); चेतावनी (मूलपाथ);}, फ़ंक्शन (गलती) {चेतावनी (गलती);}); ' –

+0

यह सुनिश्चित नहीं है कि मेरी समस्या कितनी समान थी। लेकिन एंड्रॉइडपेर्सिस्टेंटफाइल लोकेशन को संगतता के लिए एंड्रॉइड की फाइल सिस्टम के साथ कॉर्डोवा v5 + –

5

संघर्ष के घंटे के बाद, अंत में मैं sdcard स्कैन कर सकती हूं और "फाइल: // pat जैसे निर्देशिका प्रदान करके फ़ाइलों तक पहुंच प्राप्त करें htofile/"।
मैं एक एपीआई और एक नमूना परियोजना https://github.com/xjxxjx1017/cordova-phonegap-android-sdcard-full-external-storage-access-library

एपीआई

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

एपीआई स्रोत कोड

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

विन्यास

का उपयोग करने का उदाहरण प्रस्तुत किया है
  • config.xml
    हटाना प्राथमिकता: वरीयता नाम = "AndroidExtraFilesystems"

  • यकीन है कि परीक्षण वातावरण बनाने के कर सकते हैं पहुँच यह परीक्षण के समय में खुद बाह्य भंडारण है।
    फ़ाइल:: ///

पथ उदाहरण; ("deviceready" घटना प्राप्त करने के बाद एपीआई कॉल ईपी अगर आप इसे यूएसबी के साथ कनेक्ट, यकीन है कि यह एक कैमरे के रूप में कनेक्ट की गई है) file: /// somefile/
file: /// somefile
फ़ाइल: ///somefile/music/aaaaa.mp3

+0

के लिए इस मुद्दे को हल किया गया है, मैंने कॉर्डोवा-प्लगइन-मीडिया इंस्टेंस में एमपी 3 के लिए उत्पन्न यूआरएल सबमिट किया है। प्लगइन नहीं खेला था। क्या फ़ाइल के वास्तविक यूआरआई पर कोई अंतर है? – arjun

संबंधित मुद्दे