2013-04-01 49 views
3

我試圖在新的BlackBerry 10設備(Z10)中運行phonegap應用程序,但我遇到了問題。基本上,我拍了一張照片,我想用FileTransfer將它上傳到我的服務器,但FileTransfer失敗,出現FileTransferError.FILE_NOT_FOUND_ERR。BlackBerry 10,Camera和FILE_NOT_FOUND_ERR

然後我嘗試使用window.resolveLocalFileSystemURI方法,現在我得到一個FileError.NOT_FOUND_ERR。我假設這兩個錯誤是相關的。

我傳遞給這兩個的了fileURI是fileURI所是我從navigator.camera.getPicture成功執行回調,看起來是這樣的:

file:///accounts/1000/shared/camera/IMG_00000037.jpg 

我已經採取了例如黑莓應用程序從在PhoneGap的2.5.0下載和修改的index.html小幅重現該問題,我將包括下列:

<!DOCTYPE html> 
<!-- 
    Licensed to the Apache Software Foundation (ASF) under one 
    or more contributor license agreements. See the NOTICE file 
    distributed with this work for additional information 
    regarding copyright ownership. The ASF licenses this file 
    to you under the Apache License, Version 2.0 (the 
    "License"); you may not use this file except in compliance 
    with the License. You may obtain a copy of the License at 

    http://www.apache.org/licenses/LICENSE-2.0 

    Unless required by applicable law or agreed to in writing, 
    software distributed under the License is distributed on an 
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
    KIND, either express or implied. See the License for the 
    specific language governing permissions and limitations 
    under the License. 
--> 
<html> 
    <head>  
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
     <meta name="format-detection" content="telephone=no" /> 
     <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height, target-densitydpi=device-dpi" /> 
     <title>Hello World</title> 

     <script type="text/javascript" charset="utf-8"> 

     // Called when a photo is successfully retrieved 
     // 
     function onPhotoURISuccess(imageURI, testFunction) { 
      // Uncomment to view the image file URI 
      console.log(imageURI); 

      // Get image handle 
      // 
      var image = document.getElementById('image'); 

      // Unhide image elements 
      // 
      image.style.display = 'block'; 

      // Show the captured photo 
      // The inline CSS rules are used to resize the image 
      // 
      image.src = imageURI; 

      // Run our test function 
      testFunction(imageURI); 
     } 

     // Called if something bad happens. 
     // 
     function onPhotoURIFail(message) { 
      alert('Failed because: ' + message); 
     } 

     // A button will call this function 
     // 
     function getPhoto(source, testFunction) { 
      // un-sandbox file system to access shared folder 
      blackberry.io.sandbox = false; 

      // Retrieve image file location from specified source 
      navigator.camera.getPicture(
       function(imageURI) { 
        onPhotoURISuccess(imageURI, testFunction); 
       }, 
       onPhotoURIFail, 
       { 
        quality: 50, 
        destinationType: Camera.DestinationType.FILE_URI, 
        sourceType: source, 
        correctOrientation: true, 
        saveToPhotoAlbum: true 
       } 
      ); 
     } 

     // Tests whether we can resolve the imageURI returned from navigator.camera.getPicture 
     // 
     function testResolveLocalFileSystemURI(imageURI) { 
      window.resolveLocalFileSystemURI(
       imageURI, 
       function (fileEntry) { 
        var message = "Resolved local file system URI: " + imageURI; 
        document.getElementById("span").innerHTML = message; 
        console.debug(message); 
        console.debug(fileInfo); 
       }, 
       function (error) { 
        var message = "Unable to resolve local file system URI: " + imageURI + " error: " + error.code; 
        document.getElementById("span").innerHTML = message; 
        console.error(message); 
        console.debug(error); 
        console.debug("resolve error source " + error.source); 
        console.debug("resolve error target " + error.target); 
       } 
      ); 
     } 

     // Tests whether we can upload the imageURI returned from navigator.camera.getPicture using a FileTransfer 
     // 
     function testFileTransferUpload(imageURI) { 

      // Create =the file upload options 
      var options = new FileUploadOptions(); 
      options.fileKey="file"; 
      options.fileName=imageURI.substr(imageURI.lastIndexOf('/')+1); 
      options.mimeType="image/jpeg"; 

      // Create the file transfer and upload 
      var ft = new FileTransfer(); 
      ft.upload(
       imageURI, 
       encodeURI("http://some.server.com/upload.php"), 
       function (r) { 
        var message = "Code: '" + r.responseCode + "'' Response: '" + r.response + "'' Sent: '" + r.bytesSent + "'"; 
        document.getElementById("span").innerHTML = message; 
        console.debug(message); 
       }, 
       function (error) { 
        var message = "Unable to upload: " + imageURI + " error: " + error.code; 
        document.getElementById("span").innerHTML = message; 
        console.error(message); 
        console.debug(error); 
        console.debug("upload error source " + error.source); 
        console.debug("upload error target " + error.target); 
       }, 
       options 
      ); 
     } 

     // Tests whether we can upload the imageURI returned from navigator.camera.getPicture using a FileTransfer 
     // 
     function testFileSystemGetFile(imageURI) { 
      window.requestFileSystem(
       LocalFileSystem.PERSISTENT, 
       0, 
       function (fileSystem) { 
        fileSystem.root.getFile(
         imageURI, 
         {create: false}, 
         function (fileEntry) { 
          var message = "Got file: " + imageURI; 
          document.getElementById("span").innerHTML = message; 
          console.debug(message); 
          console.debug(fileInfo); 
         }, 
         function (error) { 
          var message = "Unable to get file: " + imageURI + " error: " + error.code; 
          document.getElementById("span").innerHTML = message; 
          console.error(message); 
          console.debug(error); 
          console.debug("get file error source " + error.source); 
          console.debug("get file error target " + error.target); 
         } 
        ); 
       }, 
       function (error) { 
        var message = "Unable to get file system. error: " + error.code; 
        document.getElementById("span").innerHTML = message; 
        console.error(message); 
        console.debug(error); 
        console.debug("file system error source " + error.source); 
        console.debug("file system error target " + error.target); 
       } 
      ); 
     } 
     </script> 

    </head> 
    <body> 
     <script type="text/javascript" src="cordova-2.5.0.js"></script> 
     <button onclick="getPhoto(Camera.PictureSourceType.CAMERA, testResolveLocalFileSystemURI);">Capture Photo, Test Resolve Local File System URI</button> <br> 
     <button onclick="getPhoto(Camera.PictureSourceType.CAMERA, testFileTransferUpload);">Capture Photo, Test File Transfer Upload</button> <br> 
     <button onclick="getPhoto(Camera.PictureSourceType.CAMERA, testFileSystemGetFile);">Capture Photo, Test File System Get File</button> <br> 
     <img style="display:none;" id="image" width="100" height="100" src="" /> 
     <span id="span"></span> 
    </body> 
</html> 

每當我運行應用程序,並嘗試拍攝照片時,我得到:

Unable to resolve local file system URI... 

爲什麼FileTransfer或window.resolveLocalFileSystemURI找不到從navigator.camera.getPicture返回的文件?我從所有的必需的功能和權限的PhoneGap的例子標準config.xml中(至少據我所知)

下面是我的config.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<!-- 
     Licensed to the Apache Software Foundation (ASF) under one 
     or more contributor license agreements. See the NOTICE file 
     distributed with this work for additional information 
     regarding copyright ownership. The ASF licenses this file 
     to you under the Apache License, Version 2.0 (the 
     "License"); you may not use this file except in compliance 
     with the License. You may obtain a copy of the License at 

     http://www.apache.org/licenses/LICENSE-2.0 

     Unless required by applicable law or agreed to in writing, 
     software distributed under the License is distributed on an 
     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
     KIND, either express or implied. See the License for the 
     specific language governing permissions and limitations 
     under the License. 
--> 
<!-- 
    Widget Configuration Reference: 
    http://docs.blackberry.com/en/developers/deliverables/15274/ 
--> 

<widget xmlns="http://www.w3.org/ns/widgets" 
     xmlns:rim="http://www.blackberry.com/ns/widgets" 
    version="1.0.0.0" id="org.apache.cordova.example"> 

    <name>cordovaExample</name> 

    <author>Your Name Here</author> 

    <description> 
     A sample Apache Cordova application that responds to the deviceready event. 
    </description> 

    <license href="http://opensource.org/licenses/alphabetical"> 
    </license> 

    <!-- Cordova API --> 
    <feature id="blackberry.system" required="true" version="1.0.0.0" /> 
    <feature id="org.apache.cordova" required="true" version="1.0.0" /> 
    <feature id="blackberry.find" required="true" version="1.0.0.0" /> 
    <feature id="blackberry.identity" required="true" version="1.0.0.0" /> 
    <feature id="blackberry.identity.phone" required="true" version="1.0.0.0" /> 
    <feature id="blackberry.pim.Address" required="true" version="1.0.0.0" /> 
    <feature id="blackberry.pim.Contact" required="true" version="1.0.0.0" /> 
    <feature id="blackberry.io.file" required="true" version="1.0.0.0" /> 
    <feature id="blackberry.utils" required="true" version="1.0.0.0" /> 
    <feature id="blackberry.io.dir" required="true" version="1.0.0.0" /> 
    <feature id="blackberry.app" required="true" version="1.0.0.0" /> 
    <feature id="blackberry.app.event" required="true" version="1.0.0.0" /> 
    <feature id="blackberry.system.event" required="true" version="1.0.0.0"/> 
    <feature id="blackberry.widgetcache" required="true" version="1.0.0.0"/> 
    <feature id="blackberry.media.camera" /> 
    <feature id="blackberry.ui.dialog" /> 
    <feature id="blackberry.connection" /> 
    <feature id="blackberry.bbm.platform" /> 
    <feature id="blackberry.invoke.card" /> 
    <feature id="blackberry.pim.contacts" /> 
    <feature id="blackberry.ui.contextmenu" /> 
    <feature id="blackberry.io.filetransfer" /> 
    <feature id="blackberry.io" /> 
    <feature id="blackberry.invoke" /> 
    <feature id="blackberry.invoked" /> 
    <feature id="blackberry.push" /> 
    <feature id="blackberry.media.microphone" required="true" version="1.0.0.0"/> 

    <!-- Cordova API --> 
    <access subdomains="true" uri="file:///store/home" /> 
    <access subdomains="true" uri="file:///SDCard" /> 
    <access subdomains="true" uri="file:///accounts" /> 

    <!-- Expose access to all URIs, including the file and http protocols --> 
    <access subdomains="true" uri="*" /> 

    <icon rim:hover="false" src="res/icon/blackberry/icon-80.png" /> 
    <icon rim:hover="true" src="res/icon/blackberry/icon-80.png" /> 

    <rim:loadingScreen backgroundColor="#CFCFCF" 
        foregroundImage="res/screen/blackberry/screen-225.png" 
      onFirstLaunch="true"> 
    <rim:transitionEffect type="fadeOut" /> 
    </rim:loadingScreen> 

    <content src="index.html" /> 

    <rim:permissions> 
    <rim:permit>use_camera</rim:permit> 
    <rim:permit>read_device_identifying_information</rim:permit> 
    <rim:permit>access_shared</rim:permit> 
    <rim:permit>read_geolocation</rim:permit> 
    <rim:permit>record_audio</rim:permit> 
    <rim:permit>access_pimdomain_contacts</rim:permit> 
    </rim:permissions> 

</widget> 

下面是我的插件.XML:

<?xml version="1.0" encoding="UTF-8"?> 
<!-- 
     Licensed to the Apache Software Foundation (ASF) under one 
     or more contributor license agreements. See the NOTICE file 
     distributed with this work for additional information 
     regarding copyright ownership. The ASF licenses this file 
     to you under the Apache License, Version 2.0 (the 
     "License"); you may not use this file except in compliance 
     with the License. You may obtain a copy of the License at 

     http://www.apache.org/licenses/LICENSE-2.0 

     Unless required by applicable law or agreed to in writing, 
     software distributed under the License is distributed on an 
     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
     KIND, either express or implied. See the License for the 
     specific language governing permissions and limitations 
     under the License. 
--> 
<plugins> 
    <plugin name="App"   value="org.apache.cordova.app.App"/> 
    <plugin name="Device"   value="org.apache.cordova.device.Device"/> 
    <plugin name="Camera"   value="org.apache.cordova.camera.Camera"/> 
    <plugin name="NetworkStatus" value="org.apache.cordova.network.Network"/> 
    <plugin name="Notification" value="org.apache.cordova.notification.Notification"/> 
    <plugin name="Accelerometer" value="org.apache.cordova.accelerometer.Accelerometer"/> 
    <plugin name="Geolocation" value="org.apache.cordova.geolocation.Geolocation"/> 
    <plugin name="File"   value="org.apache.cordova.file.FileManager"/> 
    <plugin name="FileTransfer" value="org.apache.cordova.http.FileTransfer"/> 
    <plugin name="Contacts"  value="org.apache.cordova.pim.Contact"/> 
    <plugin name="Capture"  value="org.apache.cordova.capture.MediaCapture"/> 
    <plugin name="Battery"  value="org.apache.cordova.battery.Battery"/> 
    <plugin name="Media"   value="org.apache.cordova.media.Media"/> 
    <plugin name="Globalization" value="org.apache.cordova.globalization.Globalization"/> 
</plugins> 

步驟來重現我的問題:

  1. 按照this指南(採用t他黑莓10(QNX)步驟)
  2. 替換我提供
  3. 用我提供的一個取代指定config.xml文件中的一個給定的index.html文件(改變應該是極小)
  4. 上進行調試一個BB10設備(我使用的是Z10)
  5. 單擊「捕獲照片」按鈕,如果你有一個遠程Web檢查連接,你應該會看到錯誤
+0

我也貼此上的PhoneGap [谷歌基](https://groups.google.com/forum/#!topic/phonegap/SaORue5G06k) – niltz

+0

以及[黑莓開發者論壇](http://supportforums.blackberry.com/t5/Web-and-WebWorks-Development/window-resolveLocalFileSystemURI-returning-FileError-NOT-FOUND/td-p/2278313/page/2)已經有了一些反饋,並且我已經用上面的建議更新了我的示例,但沒有運氣。 – niltz

回答

0

你可能想嘗試添加,<access uri="file://accounts/" subdomains="ture"/>代替'商店/家'。

編輯此外,在處理文件系統時,您需要將沙盒模式設置爲false,否則您可能無法訪問所述文件。

blackberry.io.sandbox = false; 

除此之外,它看起來像你幾乎一切安裝好。

+1

我嘗試了你的建議,但仍然沒有骰子。我更新了我的原始帖子並更新了config.xml和index.html。請注意,您在file:///中缺少一個斜槓並拼寫錯誤。當我添加它們時,我確信這些都是正確的。 – niltz

2

您需要同時執行blackberry.io.sandbox = false;並刪除文件://協議,至少以我的經驗從文件系統訪問文件。另外,你不應該直接訪問共享路徑。如圖所示的例子此頁上使用blackberry.io.sharedFolder屬性:https://developer.blackberry.com/html5/apis/blackberry.io.html

你的文件系統路徑應該是blackberry.io.sharedFolder +「相機/ IMG_00000037.jpg」

的安全沙箱的設計BB10意味着每個應用程序都有它自己的共享文件系統區域的文件路徑。

+0

這對我有用。關鍵是那個奇怪的文件系統路徑,並且不使用'resolveLocalFileSystemURI',因爲這個URI不是本地的,它是「共享的」。我們希望Phonegap們修復這個問題,以便'camera.getPicture'返回格式正確的URL。 –

0

信任我的問題,這個源頭上解決:

<html> 
<head> 
<script type="text/javascript" src="local:///chrome/webworks.js"></script> 
<script type="text/javascript"> 

function log(e) { 
    console.log(e); 
} 

function takePicture(success) { 
    blackberry.invoke.card.invokeCamera('photo', function (path) { 
     success(path); 
    }, log, log); 
} 

function openFile (filePath, success) { 
    window.webkitRequestFileSystem(window.PERSISTENT, 1024*1024*1024, function (fs) { 
     fs.root.getFile(filePath, {}, function (entry) { 
      success(entry); 
     }, log); 
    }, log); 
} 

function uploadFile (entry, server, success) { 
    entry.file(function (file) { 
     var fd = new FormData(), 
      xhr; 
     fd.append("picture", file); 
     xhr = new XMLHttpRequest(); 
     xhr.open("POST", server); 
     xhr.onload = function (evt) { 
      if (xhr.status == 200) { 
       success(xhr.response); 
      } else { 
       log(xhr); 
      } 
     }; 
     xhr.ontimeout = log; 
     xhr.onerror = log; 
     xhr.send(fd); 
    }, log); 
} 

function start() { 
    takePicture(function (filePath) { 
     openFile(filePath, function (entry) { 
      uploadFile(entry, "http://cordova-filetransfer.jitsu.com/upload", function() { 
       alert("SUCCESS"); 
      }); 
     }); 
    }); 
} 

document.addEventListener('webworksready', function() { 
    blackberry.io.sandbox = false; 
    document.getElementById("startButton").disabled = ""; 
}); 

</script> 
</head> 
<body> 
<h1>Camera XHR Upload Sample</h1> 
<button id="startButton" disabled="disabled" onclick="start();">Start</button> 
</body> 
</html> 
0

基於從四月2'13 chadtatro答案:

請在config.xml中添加

<access uri="file:///accounts/1000/removable/sdcard/" subdomains="true"/> 

我還添加了到我的項目:

webworks plugin add com.blackberry.io 
0

自從幾天以來我有同樣的問題。獲取圖像停止工作,並且我的代碼中沒有任何內容被鎖定。

小心使用cordova-plugin-file,因爲在其3.0.1-dev版本(或許也有其他)中,您開發的應用程序不會要求訪問文件的權限,並且從相機或圖庫獲取圖片將失敗。

我解決它使用2.1.0版本這個插件:

cordova plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-file.git#r2.1.0