2013-09-06 25 views
8

Với mục đích thử nghiệm, tôi đã sao chép toàn bộ ví dụ được tìm thấy trên phonegap camera API và tôi đặt cảnh báo trên onPhotoDataSuccess để kiểm tra khi nào chức năng được kích hoạt. Trên bức ảnh đầu tiên chụp cảnh báo sẽ không hiển thị. Tuy nhiên sau lần thử đầu tiên, cảnh báo sẽ hiển thị sau khi ảnh được lưu.Phonegap (3.0.0) Máy ảnh không thành công khi thử lần đầu tiên

Bạn có lời khuyên nào không? Tôi sẽ rất vui khi được cụ thể hơn nếu có điều gì đó không rõ ràng.

Tôi đã thử nghiệm mã dưới đây vào Android Galaxy S3 của tôi

<!DOCTYPE html> 
<html> 
    <head> 
    <title>Capture Photo</title> 

    <script type="text/javascript" charset="utf-8" src="cordova.js"></script> 
    <script type="text/javascript" charset="utf-8"> 

    var pictureSource; // picture source 
    var destinationType; // sets the format of returned value 

    // Wait for device API libraries to load 
    // 
    document.addEventListener("deviceready",onDeviceReady,false); 

    // device APIs are available 
    // 
    function onDeviceReady() { 
     pictureSource=navigator.camera.PictureSourceType; 
     destinationType=navigator.camera.DestinationType; 
    } 

    // Called when a photo is successfully retrieved 
    // 
    function onPhotoDataSuccess(imageData) { 
     // Uncomment to view the base64-encoded image data 
     // console.log(imageData); 

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

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

     // Show the captured photo 
     // The inline CSS rules are used to resize the image 
     // 
     smallImage.src = "data:image/jpeg;base64," + imageData; 
    } 

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

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

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

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

    // A button will call this function 
    // 
    function capturePhoto() { 
     // Take picture using device camera and retrieve image as base64-encoded string 
     navigator.camera.getPicture(onPhotoDataSuccess, onFail, { quality: 50, 
     destinationType: destinationType.DATA_URL }); 
    } 

    // A button will call this function 
    // 
    function capturePhotoEdit() { 
     // Take picture using device camera, allow edit, and retrieve image as base64-encoded string 
     navigator.camera.getPicture(onPhotoDataSuccess, onFail, { quality: 20, allowEdit: true, 
     destinationType: destinationType.DATA_URL }); 
    } 

    // A button will call this function 
    // 
    function getPhoto(source) { 
     // Retrieve image file location from specified source 
     navigator.camera.getPicture(onPhotoURISuccess, onFail, { quality: 50, 
     destinationType: destinationType.FILE_URI, 
     sourceType: source }); 
    } 

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

    </script> 
    </head> 
    <body> 
    <button onclick="capturePhoto();">Capture Photo</button> <br> 
    <button onclick="capturePhotoEdit();">Capture Editable Photo</button> <br> 
    <button onclick="getPhoto(pictureSource.PHOTOLIBRARY);">From Photo Library</button><br> 
    <button onclick="getPhoto(pictureSource.SAVEDPHOTOALBUM);">From Photo Album</button><br> 
    <img style="display:none;width:60px;height:60px;" id="smallImage" src="" /> 
    <img style="display:none;" id="largeImage" src="" /> 
    </body> 
</html> 

---------- UPDATE 1 ----------------- -

tôi đã thử nghiệm nó trên một chút mã:

(function() { 
     $scroller = $('.scroller'), 

     // Take a picture using the camera or select one from the library 
     takePicture = function (e) { 
      var options = { 
       quality: 45, 
       targetWidth: 1000, 
       targetHeight: 1000, 
       destinationType: Camera.DestinationType.FILE_URI, 
       encodingType: Camera.EncodingType.JPEG, 
       sourceType: Camera.PictureSourceType.CAMERA 
      }; 

      navigator.camera.getPicture(
       function (imageURI) { 
        console.log(imageURI); 
        alert('test'); 
        $scroller.append('<img src="' + imageURI + '"/>'); 
       }, 
       function (message) { 
        // We typically get here because the use canceled the photo operation. Fail silently. 
       }, options); 

      return false; 

     }; 

    $('.camera-btn').on('click', takePicture); 

}()); 

Và điều này có tác dụng tương tự. Nó không làm gì trong lần chụp đầu tiên nhưng nó hiển thị hình ảnh sau lần chụp thứ hai. Tôi cũng chỉ phát hiện ra rằng hình ảnh cho thấy sau khi thứ hai là snap là bức ảnh đầu tiên mà tôi đã chụp. Dường như đối số đầu tiên trong getPicture không kích hoạt trên snap đầu tiên. Điều này là bực bội như logcat không thực sự cho tôi thấy bất cứ điều gì để làm việc với.

---------------- CẬP NHẬT 2 ----------------

Tôi vừa thử trên Phonegap Build và nó hoạt động. Vì vậy, nó phải có một cái gì đó để làm với các plugin ...

+0

thực sự có thể sử dụng một câu trả lời ở đây nếu có ai biết. Đây có phải là 3.0.0 hoặc 3.0.0rc1 không? –

+1

Bạn có thể dán mã bạn đang sử dụng và cho chúng tôi biết bạn đang thử nghiệm điện thoại nào không. – Zorayr

+0

Bạn đang phát triển cho iOS? Từ [Tài liệu PhoneGap] (http://docs.phonegap.com/en/3.0.0/cordova_camera_camera.md.html#camera.getPicture): "Bao gồm cảnh báo JavaScript() trong một trong hai chức năng gọi lại có thể gây ra sự cố Quấn cảnh báo trong một setTimeout() để cho phép bộ chọn hình ảnh iOS hoặc popover đóng hoàn toàn trước khi cảnh báo hiển thị: "Nếu bạn thay đổi cảnh báo thành console.log, công việc gọi lại đầu tiên có được không? – ville

Trả lời

1

Tôi không biết liệu đây có phải là giải pháp đúng hay không nhưng nó làm việc cho tôi một cách hoàn hảo. Nó sẽ được đập để theo dõi con mèo đăng nhập của bạn và tìm thấy vấn đề chính xác.

Hãy thử sử dụng navigator.camera.PictureSourceType instated của pictureSource. như vậy có vẻ như

<button onclick="getPhoto(navigator.camera.PictureSourceType.PHOTOLIBRARY);">From Photo Library</button><br> 

và cùng cách thay thế trong mã Javascript cũng

navigator.camera.getPicture(onPhotoDataSuccess, onFail, { quality: 50, destinationType: navigator.camera.DestinationType.FILE_URI }); 

HOẶC

navigator.camera.getPicture(onPhotoDataSuccess, onFail, { quality: 50, destinationType: navigator.camera.DestinationType.DATA_URI }); 

Cập nhật: Cố gắng tiết kiệm corodova.js của bạn tại địa phương và cuộc gọi từ thư mục địa phương, vì vậy thư của bạn nên như

assets/www/js/cordova.js

<script type="text/javascript" charset="utf-8" src="js/cordova.js"></script> 

Working Code

Hy vọng điều này sẽ giúp bạn !!!

+0

navigator.camera.getPicture (cameraSuccess, cameraError, [cameraOptions]); Có vẻ như cameraSuccess xảy ra trên bức ảnh thứ hai được chụp tuy nhiên hình ảnh tôi nhận được là ảnh đầu tiên tôi chụp. –

+0

'Trên ảnh đầu tiên chụp cảnh báo sẽ không hiển thị. Tuy nhiên sau lần thử đầu tiên, cảnh báo sẽ hiển thị sau khi ảnh được lưu.'? nó có thực sự xảy ra với bạn không? Tôi đã kiểm tra mã của bạn và gọi 'alert()' bên trong 'onPhotoDataSuccess' và nó hoạt động hoàn hảo. –

1

Tôi gặp sự cố tương tự sau khi cập nhật từ 3.0.0 lên 3.1.0. Máy ảnh bị trễ, không định vị địa lý, v.v.

Hãy xem tệp platforms\android\cordova\version có phát hành phiên bản cũ hay không. Sau đó, bạn cần cập nhật nền tảng của mình. Vì vậy, đây là những gì tôi đã làm.

  • Remove tất cả các plugin: cordova plugin rm org.apache.cordova.camera
  • Tháo nền tảng: cordova platform remove android (sẽ xóa những thay đổi bạn đã thực hiện * file java)
  • Thêm nền tảng: cordova platform add android
  • Thêm tất cả các plugin: cordova plugin add org.apache.cordova.camera
  • Kiểm tra quyền
  • Xây dựng nó

Về cơ bản, nó giống như việc tạo một dự án mới.

0

có cùng một vấn đề. Capture thành công chỉ nhận được cuộc gọi lại sau khi captureVideo đã được gọi lần thứ hai.

Chỉ cần thay thế cũ app/bin/file cordova.jar tôi với mới 3.2.0 cordova-dev.jar (trong eclispe) và tất cả trở lại trật tự :)

0

Tôi có vấn đề này chính xác trên Cordova 3.4. 0, với một cài đặt Cordova mới (không nâng cấp từ phiên bản trước như một số người khác đã đăng). Việc chụp ảnh đầu tiên sẽ không làm gì cả - không gọi lại thành công, không gọi lại không thành công. Việc chụp ảnh thứ hai sẽ dẫn đến một cuộc gọi lại thành công nhưng dữ liệu DATA_URL (hình ảnh được mã hóa base64) quay lại là dữ liệu từ hình ảnh FIRST.

Đối với tôi, nó hoạt động tốt trên một điện thoại, nhiều trình mô phỏng khác nhau, v.v. ngoại trừ trên một điện thoại Android 4.2 nơi nó thực hiện điều này. Giải pháp là gỡ cài đặt ứng dụng khỏi điện thoại bằng cách sử dụng quản lý ứng dụng của điện thoại trong cài đặt, sau đó cài đặt lại ứng dụng, sau đó ảnh đầu tiên sẽ kích hoạt gọi lại thành công bằng dữ liệu của riêng ứng dụng đó.

Không biết tại sao, nhưng việc gỡ cài đặt và cài đặt lại ứng dụng đã giải quyết nó cho tôi.

0

Tôi đã gặp cùng một vấn đề và giải quyết nó. Vì bạn nhập hai "cordova.js" vào ứng dụng của mình và có thể một trong số đó nằm trong khung nội tuyến. bạn có thể sử dụng "parent.cordova" trong khung nội tuyến thay thế.

0

Tôi gặp sự cố này với Cordova 3.7.1 và Camera 0.3.5 - mỗi khi tôi gọi plugin, nó không trả lại hình ảnh/đường dẫn và cuộc gọi thứ hai, lỗi trả về "Đã hủy" cho cuộc gọi trước đó.

Vấn đề là hoạt động chính của tôi đã có onActivityResult mà không gọi chính xác phương thức của siêu.

public class MainActivity extends CordovaActivity { 
    //... 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 
      if (requestCode == MyCustomActivity) { 
        doMyCustomActivity(requestCode); 
      } 
    } 

    //... 
} 

Để khắc phục điều đó, tôi đã có thêm ELSE gọi xử lý đúng:

public class MainActivity extends CordovaActivity { 
    //... 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 
      if (requestCode == MyCustomActivity) { 
        doMyCustomActivity(requestCode); 
      } 
      else { //this was missing - call other Activity of plugins 
       super.onActivityResult(requestCode, resultCode, intent); 
      } 
    } 

    //... 
} 
Các vấn đề liên quan