ti-enxame.com

Câmera PhoneGap reinicia o aplicativo

Estou usando o PhoneGap's navigator.camera.getPicture função para recuperar uma foto da câmera do dispositivo no Android.

function onSuccess(imageData) {
    alert("Success!");
}

function onFail(message) {
    alert('Failed because: ' + message);
}

$(function() {
    $("button").tap(function() {
        navigator.camera.getPicture(onSuccess, onFail, { quality: 50 }); 
    });
});

Quando clico no botão, ele inicia a câmera, mas quando clico em OK no aplicativo da câmera depois de tirar uma foto, ele reinicia o aplicativo.

Eu tentei:

  • use diferentes tipos de fonte.
  • use diferentes tipos de destino.
  • reduzir a qualidade.

Alguma ideia?

EDIT: Eu também comecei m problema no github .

33
Alon Gubkin

Este problema não é realmente sobre Phonegap. É um problema comum em aplicativos nativos Android também.

Isso ocorre porque, quando a câmera é acionada, a atividade Android fica em segundo plano (estado onStop)), aguardando a câmera tirar a foto. Em seguida, o GC chega e mata a atividade para liberar memória antes do conclusão da ação da câmera e, quando a câmera estiver pronta, sua atividade já morreu. É por isso que o aplicativo é reiniciado.

Está ativado Android Documentos do ciclo de vida ( http://developer.Android.com/reference/Android/app/Activity.html ):

Se uma atividade for completamente obscurecida por outra atividade, ela será interrompida. Ele ainda retém todas as informações de estado e membro, no entanto, não é mais visível para o usuário, portanto sua janela fica oculta e muitas vezes é eliminada pelo sistema quando a memória é necessária em outro local.

O mesmo ocorre acessando a galeria de mídia ou outros recursos que fazem com que sua atividade fique em segundo plano. A equipe do Phonegap (agora Cordova) já está trabalhando para melhorar isso ( https://issues.Apache.org/jira/browse/CB-14 ).

Tivemos esse problema em nossa empresa e a solução foi desenvolver nativamente um plug-in Phonegap para usar nossa câmera personalizada, para que nossa atividade nunca vá para o estado onStop. Siga as Android instruções da API em http://developer.Android.com/guide/topics/media/camera.html#custom-camera e experimente também.

Até mais!


Editar 1:

Enviamos um projeto do Google Code chamado Plug-in de câmera em primeiro plano que corrige o problema de Android Câmera reiniciando os aplicativos Phonegap. algumas orientações sobre como usá-lo também.Por favor, consulte: http://code.google.com/p/foreground-camera-plugin/


Editar 2:

Como esse problema também ocorre com a galeria, enviamos outro projeto do Google Code chamado Plug-in da Galeria em primeiro plano que funciona com o Cordova e corrige esse problema. Por favor, consulte: http://code.google.com/p/foreground-gallery-plugin/

36
Vinícius Fonseca

Observe que, se você estiver testando esses aplicativos diretamente em seu telefone Android, há uma opção dentro de " Opções de desenvolvedor " chamada " Não mantenha atividades ". Quando esta opção está marcada, elimina a atividade quando você a deixa. Especificamente no caso da câmera (e outras aplicativos almoçados a partir de sua atividade), ele reiniciará sua atividade.

Desmarque isso e veja se isso ajuda.

27
Manyfatboy

Eu tenho um Samsung Galaxy Note II. Eu tive o mesmo problema. Eu mudei isso no AndroidManifest.xml e agora funciona na Samsung e HTC Thunderbolt

<uses-feature Android:name="Android.hardware.camera" Android:required="false"/>

<uses-sdk Android:minSdkVersion="7" Android:targetSdkVersion="10"/>

<activity  Android:configChanges="orientation|keyboardHidden" />
4
user372225

Os usuários não desejam reiniciar o telefone para liberar memória ou marcar uma caixa em Configurações. A maneira fácil de usar que encontrei para retornar à atividade do meu aplicativo depois de sair da câmera foi adicionar a linha:

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

no CameraLauncher.Java do plug-in cordova da câmera, imediatamente antes que this.cordova.startActivityForResult () tente transmitir o resultado da câmera. Isso garante que a atividade antiga seja recuperada, em vez de ser coletada pelo lixo e iniciada uma nova instância. Na API de intenção Android $:

int FLAG_ACTIVITY_CLEAR_TOP

"Se definido, e a atividade iniciada já estiver em execução na tarefa atual, em vez de iniciar uma nova instância dessa atividade, todas as outras atividades em cima dela serão fechadas e esse Intent será entregue ao (agora no topo) atividades antigas como uma nova Intenção ".

2
kwills

Quando Android relança o aplicativo após a foto ter sido tirada, um evento resume é enviado ao aplicativo. O evento contém os dados da foto tirada. Portanto, uma possível solução alternativa é capturar o evento:

document.addEventListener('resume', function(evt) {
  if(evt.action === 'resume' && evt.pendingResult) {
    var r = evt.pendingResult;
    if(r.pluginServiceName === 'Camera' && r.pluginStatus === 'OK') {
      // r.result contains file:/// url or a base64 image.
    }
  }
}, false);

Obviamente, você também precisa restaurar o estado do aplicativo. Para isso, salve suas informações de estado em, por exemplo. localStorage antes de abrir a câmera.

2
tuomassalo

Para mim, ajudou a usar o plugin cordova background: https://www.npmjs.com/package/cordova-plugin-background-mode

Inclua no config.xml:

<gap:plugin name="cordova-plugin-background-mode" source="npm"/>

Em seguida, acione o evento click para iniciar o plug-in da câmera e enviar o aplicativo para segundo plano:

$(document).on("click","#btn_bild_aufnehmen",function(){        
    cordova.plugins.backgroundMode.setDefaults({ text:'desc',title:'appname'});
    cordova.plugins.backgroundMode.enable();
    //do your camera stuff
});

Não se esqueça de desativar o modo de segundo plano em caso de sucesso com o plug-in da câmera:

cordova.plugins.backgroundMode.disable();

Para ter certeza, desative-o onResume e ative-o na Pausa:

function onResume(){
   window.plugin.backgroundMode.disable();
}
function onPause(){
   window.plugin.backgroundMode.enable();
}
1
zuluk

Na verdade, isso está acontecendo quando as atividades do dispositivo estão sendo eliminadas pelo coletor de lixo, quando alguns dos eventos do seu aplicativo são acionados, sua atividade padrão fica em segundo plano e, portanto, está sendo eliminada.

Para consertar isso, você precisa ir para Opções do desenvolvedor Lá você verá a opção Não manter atividades, apenas desmarque. reinicie seu aplicativo e tente a câmera agora. funcionará sem problemas.

0
Anshul Jain

Estou com um problema semelhante no qual até o exemplo completo fornecido em Camera Documentation trava o aplicativo em um dispositivo Android (Samsung, Galaxy S). Aqui está uma saída de o log que recebo:

enter image description here

0
Zorayr

Eu também tive o mesmo problema. Limpei todos os dados do telefone para aumentar o tamanho da memória interna do telefone. Em seguida, parei todos os aplicativos em execução e reiniciei o aplicativo. Dessa vez, quando o evento de captura foi chamado, meu aplicativo não travou.

Basicamente, esse problema existe para telefones com menos memória interna. Isso funcionará bem em telefones de ponta.

Nota: Adicione também estes parâmetros extras à imagem capturada:

 navigator.camera.getPicture(onPhotoDataSuccess, onFail, {
                   quality: 20,
                   destinationType:Camera.DestinationType.DATA_URL,
                   targetWidth: 200,
                   targetHeight: 200,
                   saveToPhotoAlbum : true
 });
0
Anup Veerapur