2015-12-22 2 views
1

Я разрабатываю приложение cordova (cli-5.2.0), в котором сделаны снимки с помощью плагина камеры cordova (cordova-plugin-camera, версия 1.2.0) ,Кордоба: camera.getPicture не работает с «Камера отменена»

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

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

Этот код работает отлично .. ..most времени.
На конкретном медленном устройстве Android 4.4.4 это работает отлично, как 9 из 10 раз.
Как 1 из 10, вызов не отвечает, говоря «Камера отменена» (хотя она не была отменена с помощью кнопки «Назад» или что-то в этом роде).

В этом случае срабатывает обратный вызов отказа «Камера отменен», и сразу после этого пользовательский интерфейс камеры показывается.
(если снимок сделан тогда, обратный вызов успеха не вызывается).

Трудно сказать, когда это произойдет, но похоже, что это происходит чаще, если устройство является более занятым.
Файлы журнала не показывают гораздо больше деталей, за такие вещи, как, кроме:

Попытался послать вторую функцию обратного вызова для 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

Это может быть проблема с памятью устройства. – Joerg

ответ

1

Я видел эту проблему возникают при 2 условиях - 1) Низкий память, о чем уже говорилось в @Joerg, 2) ваши события каскадируются и запускаются дважды. Например, у вас есть onClick на значке, внутри div, который также имеет другой триггер события, например a-href или другой onClick.

Если вы можете разместить свой код, это может помочь.

Обновление - 1: Определенно указывает на ситуацию с низкой памятью. Опасность угадывания здесь ... 1. Асинхронный вызов камеры происходит 2. Низкая память возвращает событие с отменой камеры 3. Камера открывается позже, когда доступно достаточно свободной памяти 4. Событие успешной камеры не может найти обратный вызов, поскольку обратный вызов уже очищен после более раннего события сбоя, что приводит к сценарию «второго обратного вызова»

Теперь у вас есть проблема с тем же самым фото/видео каждый раз?

Как вы, вероятно, избегаете этого, - не переадресуйте вызов с помощью «.then», но на самом деле выполните обычный асинхронный обратный вызов.

Кроме того, вы можете проверить и защитить от любого более раннего вызова «службы камеры».

+0

Я обновил вопрос, чтобы содержать код, который обрабатывает обработку кликов. Спасибо, Koen – KoenJ

+0

Спасибо, это исправило проблему; не могли бы вы объяснить, почему помогает использовать обычный асинхронный обратный вызов? Использует ли это меньше памяти, чем цепочку «. Then» callback? – KoenJ

+0

Это старое сообщение, но я получаю ту же проблему, и я отследил ее до того, что у меня есть несколько приложений для камеры на моем устройстве, и ошибка возникает, когда я получаю запрос о том, какую камеру я должен использовать, а затем выберите «Только один раз». Если я выберу камеру как «Всегда», я больше не получаю ошибку. – pedrodg

0

Моя проблема заключалась в том, что у меня был установлен Угловой материал, который провоцирует два и более нажатия кнопок и других элементов кликов. Чтобы решить эту проблему, я должен был добавить эту строку в свой app.js

.config(function($stateProvider, $urlRouterProvider, $mdThemingProvider, $mdGestureProvider) { 

$mdGestureProvider.skipClickHijack(); 
Смежные вопросы