3
respostas

Capturar arquivos do Storage

Bom dia. Eu fiz uma implementação semelhante ao ICamera. Consegui acessar o storage, porém, está sendo possível pegar os arquivos, não realidade preciso de qualquer arquivo. Podes me ajudar?

3 respostas

Oi Jefferson, não sei se entendi direito o seu problema. Você consegue acessar o storage para leitura, mas está tentando carregar o conteúdo do(s) arquivo(s) para o Xamarin e não consegue? Pode postar aqui seu código para darmos uma olhada? Obrigado!

Bom dia Marcelo... O TeamViewer está desconectado... Acho que não configurei o tempo de desligamento do noteboock pra "Nunca desligar". Desligou... Vou te passar o código hoje à noite. O meu caso é o seguinte... preciso acessar os arquivos (.). Usei a mesma codificação (Estrutura ICamera) porém, não configurei o (Java.IO.File arquivoImagem) pois, entendo que estou acessando os diretórios - não haveria essa necessidade e também passei outro Enumerable no MediaStore correspondente ao que abre o menu do android para acessar os arquivos... Até aqui tranquilo. Ai quando seleciono o arquivo, eu entro na OnActivityResult (int requestCode, Result resultCode, Intent data). No parâmetro data, só consigo extrair a Uri. No que vc fez, a variável (arquivoImagem ) vem preenchida com o arquivo. É uma prévia do problema... Precisaria resgatar o arquivo, quer na variável arquivoImagem - mas sem a formatação da câmera onde cria-se os diretório "Imagens" ou via a Uri que veio no parâmetro "data"

Bom dia Marcelo. Segue o código.

Page.xaml

<StackLayout>
        <Button x:Name="btnCamera" Command="{Binding CaptureImageFileCommand,Mode=OneWay}" Text="Camera"></Button>
        <Button x:Name="btnFiles" Command="{Binding OpenFileStorageCommand,Mode=OneWay}" Text="Files"></Button>
</StackLayout>

ViewModel.cs

public ICommand OpenFileStorageCommand { get; }
      public ICommand CaptureImageFileCommand { get; }


      OpenFileStorageCommand = new Command(ExecuteOpenFileStorageCommand);
      CaptureImageFileCommand = new Command(ExecuteCaptureImageFileCommand);

    //Métodos - não tem implementação pois vou fazer outra coisa com os bytes, mas está funcionando(camera)
    //estou usando a mesma interface ICamera no dependency.
     private void ExecuteOpenFileStorageCommand()
        {
            DependencyService.Get<ICamera>().CapturarMedia("FileStorage");
            MessagingCenter.Subscribe<byte[]>(this, "FileStorage",
                (bytes) =>
                {

                });
        }
        private void ExecuteCaptureImageFileCommand()
        {            
            DependencyService.Get<ICamera>().CapturarMedia("CameraImagem");
            MessagingCenter.Subscribe<byte[]>(this, "CameraImagem",
                (bytes) =>
                {

                });
        }

Activity.cs

 public void CapturarMedia(string media)
        {
            switch (media)
            {
                case "CameraImagem":
                    CameraImagem();
                    break;
                case "CameraVideo":
                    CameraVideo();
                    break;
                case "FileStorage":
                    FileStorage();
                    break;

            }
        }
private void CameraImagem()
        {
            Intent intent = new Intent(MediaStore.ActionImageCapture);

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

            if (!diretorio.Exists())
                diretorio.Mkdirs();

            arquivoImagem = new File(diretorio,
                System.DateTime.Now.Ticks.ToString() + ".jpg");

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

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

private void FileStorage()
        {
            Intent intent = new Intent(MediaStore.ExtraMediaAlbum);
            intent.SetType("*/*");
            intent.SetAction(Intent.ActionGetContent);

            var activity = Forms.Context as Activity;
            activity.StartActivityForResult(Intent.CreateChooser(intent, "Select File"), 2);
        }

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

            if (resultCode == Result.Ok && requestCode == 1)
            {
                byte[] bytes;
                using (var stream = new Java.IO.FileInputStream(arquivoImagem))
                {
                    bytes = new byte[arquivoImagem.Length()];
                    stream.Read(bytes);
                }
                //string formmattedPic = Convert.ToBase64String(bytes);

                MessagingCenter.Send<byte[]>(bytes, "CameraImagem");
            }
            else if ((requestCode == 2) && (resultCode == Result.Ok) && (data != null))
            {
//O problema esta na leitura do caminho do arquivo
//que está na variável data, o Java.IO.FileInputStream(file)
//não encontra o arquivo
                string file = data.Data.ToString();
                byte[] bytes;
                using (var stream = new Java.IO.FileInputStream(file))
                {
                    bytes = new byte[arquivoImagem.Length()];
                    stream.Read(bytes);
                }

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

Se puder dar uma luz, agradeço!