我正在开发一个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>
答案 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();