2014-12-19 2 views
1

У меня здесь действительно неприятная проблема. Каждый раз, я пытаюсь использовать плагины файлов и файлов в моем проекте, я получаю Uncaught TypeError: Не удается прочитать свойство 'dataDirectory' неопределенной ошибки, пытаясь получить каталог данных с store = cordova.file.dataDirectory;. Теперь я пытался решить свою проблему часами, но я не мог найти никакой помощи. Я также использую плагин Barcode Scanner в этом проекте, и он работает как шарм. Я использую PhoneGap 3.6.3 и jQuery Mobile 1.4.4. Так как я новичок в PhoneGap, вполне вероятно, что я что-то важное не хватает ...PhoneGap Сборка: плагины не работают (получение «неопределенных» ошибок) на Android

Я включил плагины в моей config.xml, как это:

<gap:plugin name="org.apache.cordova.file" version="1.3.1" /> 
<gap:plugin name="org.apache.cordova.file-transfer" version="0.4.6" /> 

Может быть, это может быть hint: Журнал PhoneGap Build для Windows Phone подтверждает добавление плагинов. Но похоже, что они не добавляются в сборку Android, так как я не могу найти их в журнале сборки.

Windows Phone Log:

Adding www\plugins\org.apache.cordova.file-transfer\www\FileTransfer.js

Adding www\plugins\org.apache.cordova.file-transfer\www\FileTransferError.js

Adding www\plugins\org.apache.cordova.file\www\File.js

Это часть моих index.js, за исключением функциональных возможностей сканера штрих-кодов.

var app = { 
    // Application Constructor 
    initialize: function() { 
     this.bindEvents(); 
    }, 
    // Bind Event Listeners 
    bindEvents: function() { 
     document.addEventListener('deviceready', this.onDeviceReady, false); 
     document.getElementById('download').addEventListener('click', this.downloadFile, false); 
     document.getElementById('scan').addEventListener('click', this.scan, false); 
     document.getElementById('encode').addEventListener('click', this.encode, false); 
    }, 
    onDeviceReady: function() { 
     app.receivedEvent('deviceready'); 
    }, 


    // Update DOM on a Received Event 
    receivedEvent: function(id) { 
     var parentElement = document.getElementById(id); 
     var listeningElement = parentElement.querySelector('.listening'); 
     var receivedElement = parentElement.querySelector('.received'); 

     listeningElement.setAttribute('style', 'display:none;'); 
     receivedElement.setAttribute('style', 'display:block;'); 

     console.log('Received Event: ' + id); 
    }, 
    downloadFile: function(){  
     //The directory to store data 
     var store; 

     //Used for status updates 
     var $status; 

     //URL of our asset 
     var assetURL = "https://www.dropbox.com/s/d4s8mnkfwdqylns/test.txt?dl=0"; 

     //File name of our important data file we didn't ship with the app 
     var fileName = "test.txt"; 
     document.addEventListener("deviceready", init, false); 
     function init() { 
      $status = document.querySelector("#fileStatus"); 

      $status.innerHTML = "Checking for file"; 

      store = cordova.file.dataDirectory; 

      //Check for the file. 
      window.resolveLocalFileSystemURL(store + fileName, appStart, downloadAsset); 

     } 

     function downloadAsset() { 
      var fileTransfer = new FileTransfer(); 
      console.log("About to start transfer"); 
      fileTransfer.download(assetURL, store + fileName, 
     function(entry) { 
      console.log("Success!"); 
      appStart(); 
     }, 
     function(err) { 
      console.log("Error"); 
      console.dir(err); 
     }); 
    } 
    function appStart() { 
     $status.innerHTML = "Datei aktuell"; 
    } 
}, 

// [...Functions for Barcode scanner...] 
}; 

Я также включил файл в phonegap.js в моей index.html:

<body> 
... 
<script type="text/javascript" charset="utf-8" src="phonegap.js"></script> 
<script type="text/javascript" src="js/index.js"></script> 
<script type="text/javascript"> 
    app.initialize(); 
</script> 
</body> 

Я действительно надеюсь, что кто-то может помочь мне решить мою проблему.

ответ

2

Я всегда думал, что вам нужно сначала вызвать

window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, onFileSystemSuccess, onError); 

для cordova.file материал, чтобы получить определены и быть в состоянии назвать resolveLocalFileSystemURL.

Так что в вашем случае попробуйте эту модификацию

function onFileSystemSuccess() { 
    store = cordova.file.dataDirectory; 

    //Check for the file. 
    window.resolveLocalFileSystemURL(store + fileName, appStart, downloadAsset); 
} 
window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, onFileSystemSuccess, onError); 
+0

Спасибо за ваш ответ. Я применил вашу модификацию, и теперь она говорит: 'Uncaught ReferenceError: LocalFileSystem не определен'. : D – tyso89

+0

О, извините, скопировал его из моего производственного кода, где _LocalFileSystem.PERSISTENT_ равно 1, поэтому, пожалуйста, измените его на 1, чтобы исправить это. –

+0

К сожалению, это не решило проблему. Есть ли у вас другая идея? Я не могу думать прямо. Но завтра я вернусь. Может быть, мне придется сводить код только к материалам 'cordova.file' и' cordova.file-transfer', чтобы найти проблему. – tyso89

Смежные вопросы