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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top