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?
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
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?
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!