Cordova:camera.getPicture失败,“相机已取消”

时间:2015-12-22 20:21:32

标签: android cordova

我正在开发一个cordova应用程序(cli-5.2.0),其中使用cordova相机插件(cordova-plugin-camera,版本1.2.0)拍摄照片。

var camera = navigator.camera;
var cameraOptions = { 
  destinationType: Camera.DestinationType.DATA_URL
};

camera.getPicture(function(result) {
    alert('success');
  }, function(error) {
    alert('fail ' + error);
  }, cameraOptions);

此代码工作正常......大部分时间。
在一个特别慢的Android 4.4.4设备上,这只能像10次中的9次一样正常工作。
在十分之一的情况下,呼叫失败说'相机已取消'(虽然没有用后退按钮取消它)。

在这种情况下,会触发故障回调'Camera canceled',然后就会显示Camera UI。
(如果拍摄了照片,则不会调用成功回调)。

很难判断这种情况何时发生,但如果设备是应用程序更繁忙,它看起来更频繁发生。
除了以下内容之外,日志文件没有显示更多细节:

  

尝试为ID发送第二个回调:Camera1337050609

但是,如果调用成功,也会写入这些日志。


任何提示或帮助都非常感谢。

谢谢你的时间,
柯恩

更新1 (回复评论)

ProjectDetailCtrl.prototype.takePhoto = function () {
    var _this = this;
    // this cameraService calls the code from above
    return this.cameraService.getPicture()
        .then(function (imageData) {
            _this.$log.debug('got camera data');
            // ..
        },
<!-- This is an angular application, the click handling goes like: -->
<md-button ng-click="vm.takePhoto()">
    Add photo
</md-button>

2 个答案:

答案 0 :(得分:1)

我已经看到这个问题在2个条件下发生 - 1)@Joerg已经提到的低内存,2)你的事件是级联的,并且被触发两次。例如,你有一个onClick上的一个图标,在div内部还有另一个事件触发器,如a-href或另一个onClick。

如果你可以发布你的代码,它可能会有帮助。

更新 - 1: 绝对表示内存不足的情况。这里有猜测...... 1.发生Asynch对相机的调用 2.低内存返回相机取消失败事件 3.当有足够的可用内存时,相机会稍后打开 4.摄像机成功事件无法找到回调,因为在早期失败事件之后回调已经被清除,导致第二次回拨&#39;方案

现在,您每次使用完全相同的照片/视频时遇到此问题吗?

你可以避免这种情况的方法是 - 不要使用&#34; .then&#34;但实际上是进行常规的异步回调。

此外,您可能希望检查并防止之前对相机服务的任何调用&#39;完了。

答案 1 :(得分:0)

我的问题是我安装了Angular材料,这会导致按钮和其他点击元素被触发两次。要解决这个问题,我必须在app.js

中添加这一行
.config(function($stateProvider, $urlRouterProvider, $mdThemingProvider, $mdGestureProvider) {

$mdGestureProvider.skipClickHijack();