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

Java.IO.FileNotFoundException

Estou tendo problemas ao pegar o caminho da imagem.

O erro acontece no metodo OnActivityResult na linha

using (var stream = new Java.IO.FileInputStream(arquivoImagem))

mas acredito que o problema é na linha de pegar o caminho

Java.IO.File diretorio = new Java.IO.File(System.IO.Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "Imagens"));

Só não consigo prosseguir

Erro: Unhandled Exception:

Java.IO.FileNotFoundException: /data/user/0/com.companyname.ClubeDoFutebol.Android.Android/files/Imagens/MinhaFoto.jpg (No such file or directory) occurred

using System;
using Java.Net;
using Android.App;
using Android.Content.PM;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using ClubeDoFutebol.Droid;
using Android.Content;
using Android.Provider;
using Xamarin.Forms;
using ClubeDoFutebol.Media;
using Android;

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

        public void TirarFoto()
        {
            Intent intent = new Intent(MediaStore.ActionImageCapture);

            //Criando Objeto para receber imagem
            Java.IO.File arquivoImagem;

            arquivoImagem = PegarArquivoImagem();

            var caminho = global::Android.Net.Uri.FromFile(arquivoImagem);
            //Salvando a Imagem
            intent.PutExtra(MediaStore.ExtraOutput,caminho );

            var activity = Forms.Context as Activity;
            activity.StartActivityForResult(intent, 0);
        }

        private static Java.IO.File PegarArquivoImagem()
        {
        //Tive que ALTERAR pois o modo apresentado no curso não funcionou
            //Criando Variavel e Selecionado a pasta para Salvar
            Java.IO.File diretorio = new Java.IO.File(System.IO.Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "Imagens"));

            //Verificando se o diretorio existe para salvar a foto
            if (!diretorio.Exists())
            {
                diretorio.Mkdirs();
            }

            //Criando o objeto que recebe a imagem e definindo o nome dela.
            arquivoImagem = new Java.IO.File(diretorio, "MinhaFoto.jpg");

            return arquivoImagem;
        }



        protected override void OnCreate(Bundle savedInstanceState)
        {
            //TabLayoutResource = Resource.Layout.Tabbar;
            //ToolbarResource = Resource.Layout.Toolbar;
            StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
            StrictMode.SetVmPolicy(builder.Build());
            base.OnCreate(savedInstanceState);
            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
            LoadApplication(new App());
            //var x = typeof(Xamarin.Forms.Themes.DarkThemeResources);
        }

        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, "FotoTirada");
            }

        }
    }
}
3 respostas

Oi Marcos, tudo bem?

Por favor, troque este trecho de código:

    Java.IO.File diretorio = new Java.IO.File(
        System.IO.Path.Combine(
            System.Environment.GetFolderPath(
            System.Environment.SpecialFolder.Personal), "Imagens"));

Por este:

    Java.IO.File diretorio = new Java.IO.File(
    Android.OS.Environment.GetExternalStoragePublicDirectory(
    Android.OS.Environment.DirectoryPictures), "Imagens");

Veja que estou trocando no seu código as pastas do sistema que são utilizadas para gravar a imagem. Veja se isso resolve e nos avise, por favor.

Quando adiciono estas linhas recebo uma mensagem de erro.

Tentei instalar os pacotes novamente, remover os blocos using e add novamente.

Mas não conseguir compilar mais.

Error    CS0234    The type or namespace name 'OS' does not exist in the namespace 'ClubeDoFutebol.Android' (are you missing an assembly reference?)
solução!

Consegui resolver o problema.

Adicionei as linhas que você me indicou, mas continuaram a dar erro, como se estivesse faltando importar algum pacote.

Quando coloquei o "global::" na frente das linhas onde existiam o erro eles sumiram e consegui dar um build no projeto e agora consigo tirar fotos e salvar.

Então meu código ficou assim:

Java.IO.File diretorio = new Java.IO.File(
    global::Android.OS.Environment.GetExternalStoragePublicDirectory(
    global::Android.OS.Environment.DirectoryPictures), "Imagens");

Obrigado pela ajuda.