Abrindo PDF com outro aplicativo da pasta de ativos, soluções alternativas
-
26-12-2019 - |
Pergunta
No meu aplicativo, tenho alguns PDFs armazenados na minha pasta de ativos.Já vi bibliotecas para abrir páginas em PDF, mas acho que aplicativos como o quickoffice são melhores para mostrar os PDFs do que as bibliotecas que vi.Portanto, desejo mostrar o pdf usando Intent.ACTION_VIEW
, assim:
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(fileUri, "application/pdf");
getActivity().startActivity(intent);
No entanto, isso não é possível porque aplicativos de terceiros não têm permissão para acessar arquivos no meu pacote.Portanto, preciso copiar os arquivos para o armazenamento externo e fornecer esse arquivo para a intenção.
Isso me leva à minha pergunta:meus PDFs são muito grandes, então acho que seria estúpido armazená-los duas vezes (uma vez na minha pasta de ativos e outra no armazenamento externo).Então, estou me perguntando se existe uma solução alternativa para isso.Eu poderia, por exemplo, fazer:
//Copy file to external storage
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(fileUri, "application/pdf");
getActivity().startActivity(intent);
//Delete file from external storage
Esta é uma boa solução alternativa ou causará problemas com o aplicativo de visualização de PDF?Ou existe uma solução alternativa diferente?
Solução
Portanto, preciso copiar os arquivos para o armazenamento externo e fornecer esse arquivo para a intenção.
Você também pode tentar meu StreamProvider
, uma lata ContentProvider
, com base no Google FileProvider
, que flui de ativos.
Para vários ativos, isso deve funcionar para o StreamProvider
Metadados XML:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<asset
name="whatevs"/>
</paths>
Isso deve resolver tudo content://your.authority.name.goes.here/whatevs/*
Uri
valores (para vários valores de *
) para arquivos dentro de assets/
.Se você quiser limitar o escopo a algum subdiretório específico do assets/
(dizer, assets/goodstuff/
), você usaria:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<asset
name="whatevs"
path="goodstuff/"/>
</paths>
E, se isso não funcionar, deveria, então fique à vontade para registrar um problema com um caso de teste reproduzível.
Esta é uma boa solução alternativa ou causará problemas com o aplicativo de visualização de PDF?
startActivity()
é assíncrono e, portanto, o visualizador de PDF externo nunca poderá acessar o arquivo dessa maneira.