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

Erro em activity.StartActivityForResult(intent, 0);

Esse trecho dá erro na segunda linha, vi em um post aqui que se desse erro da forma que foi passado no curso, usasse a primeira linha dessa forma:

var activity = CrossCurrentActivity.Current.Activity;
activity.StartActivityForResult(intent, 0);

Contudo, ainda persiste erro, os seguinte erro:

Android.OS.FileUriExposedException: <Timeout exceeded getting exception details>
Android.OS.FileUriExposedException: file:///storage/emulated/0/Pictures/Imagens/MinhaFoto.jpg exposed beyond app through ClipData.Item.getUri()

como resolver?

Agradeço, desde já.

6 respostas

Olá, José Rubens

Procurando na internet, encontrei algumas pessoas que resolveram o problema adicionando 2 linhas antes da chamdada do método base.OnCreate na classe App:

  StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
  StrictMode.SetVmPolicy(builder.Build());

O código deve ficar assim:

protected override void OnCreate(Bundle savedInstanceState){
  StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
  StrictMode.SetVmPolicy(builder.Build());
  base.OnCreate(savedInstanceState);
  ...
}

Essa classe StrictMode serve para evitar "crash" no acesso a arquivos, como no seu caso. Se continuar com problemas, nos avise por favor. Abs.

Boa tarde Professor, prazer em falar com você.

Uma pergunta, na classe app mesmo? Ou na classe MainActivity do android?

Se for na classe App então seria no método OnStart()?

Em todo o caso, testei dos dois jeitos e não funcionou, continuou com erro:

Java.Lang.SecurityException: <Timeout exceeded getting exception details>

Colocando o código que você passou na classe App no método onStart() mudou o erro para:

Java.Lang.SecurityException: Permission Denial: starting Intent { act=android.media.action.IMAGE_CAPTURE flg=0x3 cmp=com.lge.camera/.app.CameraActivity clip={text/uri-list U:file:///storage/emulated/0/Pictures/Imagens/MinhaFoto.jpg} (has extras) } from ProcessRecord{3ffecac 3069:com.companyname.EmkoAplicativo/u0a267} (pid=3069, uid=10267) with revoked permission android.permission.CAMERA
solução!

Olá, José Rubens

Vamos tentar de outra forma agor. Por favor, siga esses passos como descritos na documentação da Microsoft:

https://docs.microsoft.com/pt-br/xamarin/android/app-fundamentals/permissions?tabs=vswin

É possível declarar as permissões usando o suporte de ferramenta embutido no Visual Studio:

1 - Clique duas vezes em propriedades no Solution Explorer e selecione a guia do manifesto do Android na janela Propriedades:

2 - Se o aplicativo ainda não tiver um AndroidManifest.xml, clique em AndroidManifest.xml não encontrado. Clique para adicionar um conforme mostrado abaixo:

3 - Selecione as permissões que seu aplicativo precisa na lista de permissões e salve:

Professor, muito obrigado pelo feedback.

Eu tentei de toda forma e só consegui assim:

usei esse tutorial: https://julianocustodio.com/2017/08/31/camera-xamarin-forms/

e aí dava erro de permissão de câmera ai eu usei o código abaixo para pedir permissão ao abrir o app:

#region RuntimePermissions

        void TryToGetPermissions()
        {
            if ((int)Build.VERSION.SdkInt >= 23)
            {
                GetPermissions();
                return;
            }


        }
        const int RequestLocationId = 0;

        readonly string[] PermissionsGroupLocation =
            {
                            //TODO add more permissions
                            Manifest.Permission.Camera,
                            Manifest.Permission.ReadExternalStorage,
                            Manifest.Permission.WriteExternalStorage,
             };
        void GetPermissions()
        {
            const string permission = Manifest.Permission.Camera;

            if (CheckSelfPermission(permission) == (int)Android.Content.PM.Permission.Granted)
            {
                //TODO change the message to show the permissions name
                //Toast.MakeText(this, "Permissões garantidas!", ToastLength.Short).Show();
                return;
            }

            if (ShouldShowRequestPermissionRationale(permission))
            {
                //set alert for executing the task
                AlertDialog.Builder alert = new AlertDialog.Builder(this);
                alert.SetTitle("Permissões necessárias.");
                alert.SetMessage("A aplicação necessita de permissões especiais para continuar.");
                alert.SetPositiveButton("Aceitar permissões", (senderAlert, args) =>
                {
                    RequestPermissions(PermissionsGroupLocation, RequestLocationId);
                });

                alert.SetNegativeButton("Cancelar", (senderAlert, args) =>
                {
                    Toast.MakeText(this, "Cancelado!", ToastLength.Short).Show();
                });

                Dialog dialog = alert.Create();
                dialog.Show();


                return;
            }

            RequestPermissions(PermissionsGroupLocation, RequestLocationId);

        }
        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
        {
            switch (requestCode)
            {
                case RequestLocationId:
                    {
                        if (grantResults[0] == (int)Android.Content.PM.Permission.Granted)
                        {
                            Toast.MakeText(this, "Permissões garantidas!", ToastLength.Short).Show();

                        }
                        else
                        {
                            //Permission Denied :(
                            Toast.MakeText(this, "Permissões negadas!", ToastLength.Short).Show();

                        }
                    }
                    break;
            }
            //base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        }

        #endregion

e no método onCreate do MainActivity do Android ficou assim:

protected override async void OnCreate(Bundle bundle)
        {
            TryToGetPermissions();

            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar;

            base.OnCreate(bundle);

            await CrossMedia.Current.Initialize();

            global::Xamarin.Forms.Forms.Init(this, bundle);

            LoadApplication(new App());
        }

Aí funciona tanto tirar foto quanto pegar foto da galeria.

Muito obrigado pela ajuda. Deixei o feedback aí para caso alguém precise.

Abraço.

Excelente, José Rubens! Obrigado pelo seu esforço, vai ser útil para várias pessoas, inclusive pra mim ;-)