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?
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!