Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Erro ao abrir camera no android 7

Eae pessoal, estou com um problema no plugin de câmera que quando aperto para abrir a câmera acontece o seguinte erro:

file:///storage/emulated/0/Android/data/com.ionic.viewapp/cache;.Pic.jpg exposed beyond app through ClipData.Item.getUri()

pesquisando pelo fórum encontrei um tópico falando que o problema é na versão do android do meu celular de teste, que no caso é a versão 7 do android, e neste mesmo topico vi que podia ver a documentação (https://developer.android.com/reference/android/support/v4/content/FileProvider.html) para a solução do problema.

O problema é que como ainda sou iniciante, não consegui entender como posso fazer para resolver o problema. Alguém poderia me ajudar a resolver isso?

o código do controller esta assim (ele funciona nas outras versões do android, apenas na versão 7 que esta com o erro):

app.controller('NovoUsuarioCtrl', function ($scope, $ionicPlatform, $cordovaCamera) {

  $scope.foto = {};

  $scope.tirarFoto = function () {
    $ionicPlatform.ready(function () {
      var options = {
        quality: 50,
        destinationType: Camera.DestinationType.DATA_URL,
        sourceType: Camera.PictureSourceType.CAMERA,
        allowEdit: true,
        encodingType: Camera.EncodingType.JPEG,
        targetWidth: 500,
        targetHeight: 500,
        popoverOptions: CameraPopoverOptions,
        saveToPhotoAlbum: false,
        correctOrientation: true
      };

      $cordovaCamera.getPicture(options).then(function (imageData) {
        $scope.foto.url = "data:image/jpeg;base64," + imageData;
      },
        function (erro) {
          console.log(erro);
        });
    });
  };
})
3 respostas

Oi.

Para ter certeza que é a versão do android, vc já fez o teste com uma versão mais antiga do android? Versão 6, de preferencia pois foi a versão que eu usei no curso.

solução!

Leonardo, bom dia!

Consegui resolver o problema com o Android 7.

O link que você passou foi muito útil, infelizmente é uma solução apenas para o desenvolvimento nativo, mas me ajudou a compreender como fazer.

Em resumo, bem resumido mesmo, kkkk

O problema é por questões de segurança, o acesso via file:// abre brechas de segurança, e a recomendação agora é usar content://

O link que você passou, explica como fazer a liberação do file:// no arquivo onde as permissões são liberadas para o app.

Mas no nosso caso, não é nativo, como fazer?

Simples, deixar que o sistema operacional nos dê a opção. Então não definimos mais por qual caminho vamos pegar o retorno da imagem.

Remova as linhas: "DestinationType" e "SourceType"

Desta forma, não estamos forçando o sistema a liberar o file:// ele escolherá o caminho.

No Android 7, o sistema enão perguntará ao usuário se ele permite o acesso, veja: http://pasteboard.co/2Dcmudanf.png

Claro que autorizei, e consegui simular uma foto com a câmera. Lembrando que estou usando um emulador.

Veja a imagem capturada no profile do usuário: http://pasteboard.co/2DcUrHB5H.png

Segue minhas configurações da câmera, veja as linhas que comentei.

var opcoes = {
                correctOrientation: true,
                quality: 70,
                // encodingType: Camera.EncodingType.JPEG,
                // sourceType : Camera.PictureSourceType.CAMERA,
                allowEdit : true,
                saveToPhotoAlbum: false,
                targetWidth: 300,
                targetHeight: 300,
                cameraDirection : 1
            };

            $cordovaCamera.getPicture( opcoes ).then(function( foto ){

                $scope.caminhoFoto = foto;

            }, function(erro){
                //
            });

Muito obrigado pela ajuda Adriano