3

新しい BlackBerry 10 デバイス (Z10) で phonegap アプリを実行しようとしていますが、問題が発生しています。基本的に、私は写真を撮り、それを FileTransfer でサーバーにアップロードしたいのですが、FileTransfer は FileTransferError.FILE_NOT_FOUND_ERR で失敗します。

次に、window.resolveLocalFileSystemURI メソッドを使用してみましたが、FileError.NOT_FOUND_ERR が発生しました。これら2つのエラーが関連していると思います。

これらの両方に渡す fileURI は、navigator.camera.getPicture 成功コールバックから返される fileURI であり、次のようになります。

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

phonegap 2.5.0 のダウンロードからサンプルの blackberry アプリを取得し、問題を再現するために 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>

以下は私のplugins.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. このガイドに従ってください (BlackBerry 10(QNX) の手順を使用)
  2. 指定された index.html ファイルを私が提供したものに置き換えます
  3. 指定された config.xml ファイルを私が提供したものに置き換えます (変更は最小限にする必要があります)
  4. BB10 デバイスでデバッグします (私は Z10 を使用しています)。
  5. [写真をキャプチャ] ボタンをクリックします。リモート Web インスペクタが接続されている場合は、エラーが表示されます。
4

6 に答える 6

1

私がここで見た問題によく似ています: https://github.com/blackberry/BB10-WebWorks-Framework/issues/536

file://プロトコルを削除して、 /accounts/1000/shared/camera/ IMG_00000037.jpgだけを取得してみてください。

于 2013-04-03T22:07:22.580 に答える
0

2013 年 4 月 2 日のチャダトロの回答に基づく:

config.xml に追加してください

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

私も自分のプロジェクトに追加しました:

webworks plugin add com.blackberry.io
于 2014-05-01T10:43:12.493 に答える
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>
于 2013-09-06T13:00:00.887 に答える
0

<access uri="file://accounts/" subdomains="ture"/>「店/家」の代わりに、追加してみてください。

編集:また、ファイルシステムを扱うときは、サンドボックスモードをfalseに設定する必要があります。そうしないと、上記のファイルにアクセスできない場合があります。

blackberry.io.sandbox = false;

それ以外は、ほとんどすべてがうまくセットアップされているようです。

于 2013-04-02T14:26:02.527 に答える
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
于 2015-08-26T08:31:33.510 に答える