3
respostas

Problemas ao tirar foto

Ao fazer o deploy da aplicação no meu smartphone (Android M) e tentar utilizar a camera dele, estou recebendo o seguinte erro de permissão :

{ act=android.media.action.IMAGE_CAPTURE flg=0x3 cmp=android/com.android.internal.app.ResolverActivity clip={text/uri-list U:file:///storage/emulated/0/Pictures/Imagens/MinhaFoto.jpg} (has extras) } from ProcessRecord{b8040ea 13215:com.companynam5e.App_/u0a203} (pid=13215, uid=10203) with revoked permission android.permission.CAMERA

As permissões foram dadas tanto nas propriedas da solution como no androidmanifest.xml como na própria aplicação através do gerenciador de aplicações do android

Gostaria também de saber de possível porque recebo o erro Java.Lang.NullPointerException: Attempt to invoke virtual method 'int android.content.Context.checkSelfPermission(java.lang.String)' ao tentar chamar a função CheckPermission.

3 respostas

Olá, Pedro

Pode postar aqui o código da classe que faz a chamada ao CheckPermission para darmos uma olhada? Obrigado!

[assembly: Xamarin.Forms.Dependency(typeof(MainActivity))]
namespace App_.Droid
{
    [Activity (Label = "App_", Icon = "@drawable/icon", Theme="@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity, ICamera
    {
        static Java.IO.File arquivoImagem;

        public void TirarFoto()
        {
            try
            {
                if (CheckSelfPermission(Manifest.Permission.Camera) //Erro do null pointer exception
                      != Permission.Granted)
                {
                    // TODO
                }
            }
            catch (Exception e){}            

            Intent intent = new Intent(MediaStore.ActionImageCapture);

            arquivoImagem = PegarArquivoImagem();

            intent.PutExtra(MediaStore.ExtraOutput, Android.Net.Uri.FromFile(arquivoImagem));

            var activity = Forms.Context as Activity;
            //Erro de revoked permission
            activity.StartActivityForResult(intent, 0);
        }

        private static Java.IO.File PegarArquivoImagem()
        {
            Java.IO.File arquivoImagem;
            Java.IO.File diretorio = new Java.IO.File(Android.OS.Environment
                                               .GetExternalStoragePublicDirectory(
                                                      Android.OS.Environment.DirectoryPictures), "Imagens");
            if (!diretorio.Exists())
                diretorio.Mkdirs();

            arquivoImagem = new Java.IO.File(diretorio, "MinhaFoto.jpg");
            return arquivoImagem;
        }

        protected override void OnCreate (Bundle bundle)
        {
            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar; 

            base.OnCreate (bundle);

            global::Xamarin.Forms.Forms.Init (this, bundle);
            LoadApplication (new App_.App ());
        }

        protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
        {
            base.OnActivityResult(requestCode, resultCode, data);

            if(resultCode == Result.Ok)
            {
                byte[] bytes;
                using (var stream = new Java.IO.FileInputStream(arquivoImagem))
                {
                    bytes = new byte[arquivoImagem.Length()];
                    stream.Read(bytes);
                }

                MessagingCenter.Send<byte[]>(bytes, "TirarFoto");
            }
        }
    }
}

Pedro, estava comparando seu código com o código da aula, e percebi que o trecho abaixo não está no código da Alura:

            try
            {
                if (CheckSelfPermission(Manifest.Permission.Camera) //Erro do null pointer exception
                      != Permission.Granted)
                {
                    // TODO
                }
            }
            catch (Exception e){}

Você pode comentar esse trecho e ver se funciona, por favor?