Hello I have a problem to open file after download it, follow my code:
In my xamarin.forms my abstract class:
namespace TrackerMobile.Forms.Util
{
public abstract class IManipuladorArquivo
{
public async Task BaixarArquivo(Func<Task<Stream>> taskRelatorio, string nomeArquivo, IPageDialogService pageDialogService)
{
await Task.Run(() =>
{
try
{
string caminhoArquivo = MontarCaminhoArquivo(nomeArquivo);
using (Stream arquivo = taskRelatorio().Result)
{
if (arquivo != null)
{
byte[] arquivoByte = new byte[arquivo.Length];
using (MemoryStream ms = new MemoryStream())
{
int read;
while ((read = arquivo.Read(arquivoByte, 0, arquivoByte.Length)) > 0)
{
ms.Write(arquivoByte, 0, read);
}
File.WriteAllBytes(caminhoArquivo, ms.ToArray());
}
}
else
{
Device.BeginInvokeOnMainThread(() =>
pageDialogService.DisplayAlertAsync(AppResources.RelatorioPercursosAnteriores_Titulo,
AppResources.RelatorioPercursosAnteriores_SemDados,
AppResources.MensagemGenerica_Dialog_OpcaoOk));
return;
}
}
Device.BeginInvokeOnMainThread(async () =>
{
if (await pageDialogService.DisplayAlertAsync(AppResources.RelatorioPercursosAnteriores_Titulo,
string.Format(AppResources.RelatorioPercursosAnteriores_MensagemConclusao, nomeArquivo),
AppResources.MensagemGenerica_Dialog_OpcaoSim,
AppResources.MensagemGenerica_Dialog_OpcaoNao))
{
AbrirArquivo(caminhoArquivo);
}
});
}
catch (Exception)
{
Device.BeginInvokeOnMainThread(() => pageDialogService.DisplayAlertAsync(AppResources.RelatorioPercursosAnteriores_Titulo,
AppResources.RelatorioPercursosAnteriores_ErroGeracaoRelatorio,
AppResources.MensagemGenerica_Dialog_OpcaoOk));
}
});
}
protected abstract void AbrirArquivo(string caminhoArquivo);
protected abstract string MontarCaminhoArquivo(string nomeArquivo);
}
}
Implementation in my android project:
namespace TrackerMobile.Forms.Droid
{
public class AndroidManipuladorArquivo : IManipuladorArquivo
{
protected override string MontarCaminhoArquivo(string nomeArquivo)
=> Path.Combine(AndrdoidEv.ExternalStorageDirectory.Path, AndrdoidEv.DirectoryDownloads, nomeArquivo);
protected override void AbrirArquivo(string caminhoArquivo)
{
Java.IO.File file = new Java.IO.File(caminhoArquivo);
file.SetReadable(true);
string application = "";
string extensao = Path.GetExtension(caminhoArquivo);
switch (extensao.ToLower())
{
case ".pdf":
application = "application/pdf";
break;
case ".xls":
case ".xlsx":
application = "application/vnd.ms-excel";
break;
default:
application = "*/*";
break;
}
AndrdoidUri uriArquivo = FileProvider.GetUriForFile(Application.Context, "TrackerMobile.Forms.Android.provider", file);
Intent intent = new Intent(Intent.ActionView);
intent.SetDataAndType(uriArquivo, application);
intent.SetFlags(ActivityFlags.ClearWhenTaskReset | ActivityFlags.NewTask);
Application.Context.StartActivity(intent);
}
}
}
When my app try to open a file the intent stay blank, but when I a try access it in a file system and try to open its work normally.
I try to check my file using 'File.Exists(caminhoArquivo);' the verification return true, please help-me