首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BlackBerry 10,照相机和FILE_NOT_FOUND_ERR

BlackBerry 10,照相机和FILE_NOT_FOUND_ERR
EN

Stack Overflow用户
提问于 2013-04-01 20:48:59
回答 6查看 2K关注 0票数 3

我正试图在一个新的BlackBerry 10设备(Z10)中运行一个phonegap应用程序,我遇到了一个问题。基本上,我拍了一张照片,我想用FileTransfer上传到我的服务器,但是FileTransfer在FileTransferError.FILE_NOT_FOUND_ERR上失败了。

然后我尝试使用window.resolveLocalFileSystemURI方法,现在我得到了一个FileError.NOT_FOUND_ERR。我假设这两个错误是相关的。

我要传递给这两种方法的fileURI都是从navigator.camera.getPicture成功回调中得到的fileURI,类似于:

代码语言:javascript
复制
file:///accounts/1000/shared/camera/IMG_00000037.jpg

我以PhoneGap2.5.0下载的黑莓应用程序为例,对index.html做了一些修改,以复制问题,我将在下面介绍这个问题:

代码语言:javascript
复制
<!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>

每当我运行这个应用程序并尝试拍照时,我就会得到:

代码语言:javascript
复制
Unable to resolve local file system URI...

为什么FileTransfer或window.resolveLocalFileSystemURI找不到从navigator.camera.getPicture返回的文件?我有phonegap示例中的标准config.xml,它具有所有必需的特性和权限(至少据我所知)

下面是我的config.xml:

代码语言:javascript
复制
<?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>

下面是我的plugins.xml:

代码语言:javascript
复制
<?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. 遵循指南(使用BlackBerry 10(QNX)步骤)
  2. 将给定的index.html文件替换为我提供的文件
  3. 将给定的config.xml文件替换为我提供的文件(更改应该是最小的)
  4. 在BB10设备上调试它(我使用的是Z10)
  5. 单击“捕获照片”按钮,如果已连接远程web检查器,则应看到错误。
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-04-08 16:09:23

您需要同时执行blackberry.io.sandbox = false;和删除文件:// protocol,至少根据我从文件系统访问文件的经验。此外,您不应该直接访问共享路径。使用blackberry.io.sharedFolder属性,如本页上的示例所示:https://developer.blackberry.com/html5/apis/blackberry.io.html

您的文件系统路径应该是blackberry.io.sharedFolder + 'camera/IMG_00000037.jpg‘

BB10的安全沙箱设计意味着每个应用程序都有到共享文件系统区域的自己的文件路径。

票数 2
EN

Stack Overflow用户

发布于 2013-04-03 22:07:22

听起来很像我在这里看到的问题:https://github.com/blackberry/BB10-WebWorks-Framework/issues/536

尝试放弃file://协议以获得公正:/accounts/1000/shared/camera/IMG_00000037.jpg

票数 1
EN

Stack Overflow用户

发布于 2013-04-02 14:26:02

您可能想尝试添加,<access uri="file://accounts/" subdomains="ture"/>代替‘商店/家’。

编辑:此外,在处理文件系统时,您需要将沙箱模式设置为false,否则您可能无法访问该文件。

代码语言:javascript
复制
blackberry.io.sandbox = false;

除此之外,看起来你几乎所有的设置都很好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15751619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档