Bom dia. Meu 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;
//Aqui neste ponto ocorre a exceção
using (var stream = new Java.IO.FileInputStream(file))
{
bytes = new byte[arquivoImagem.Length()];
stream.Read(bytes);
}
MessagingCenter.Send<byte[]>(bytes, "FileStorage");
}
}
O problema está na leitura do caminho do arquivo que está na variável data (em requestCode == 2), o Java.IO.FileInputStream(file) não encontra o arquivo... Existe outra forma de capturar o arquivo? Ou esta metodologia poderá ser ajustada? Se alguém souber e puder dar uma luz, agradeço!