Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Arquivo para impressão pelo Android

Preciso imprimir algo parecido com um relatório direto do android. Alguém tem uma sugestão de como fazer isso? Tenho que gerar um PDF antes se salvar no dispositivo para impressão? Alguém tem uma sugestão

4 respostas

Fala ai Bruno, de boa ?

Você quer fazer com que o android execute uma impressora ? Se for isso, sim, você terá que gerar o pdf e solicitar para a sua impressora, que deve estar na rede, imprimir, por exemplo.

Entendi. Eu até consegui gerar o pdf na pasta mas não consigo abrir o arquivo, pois o FileProvider não consegue encontrar o arquivo e está acabando com minha raça.

O arquivo chega a ser criado pois verifiquei manualmente nos diretórios. Coloquei alguns logs pra ver o que acontece mas mesmo assim não consigo entender porque ele não encontra

AndroidManifest.xml

 <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/filepaths" />
        </provider>

filepaths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-files-path name="files" path="."/>
</paths>

criação do arquivo pdf

File docsFolder = new File(Environment.getExternalStorageDirectory()+"/compras");
        if (!docsFolder.exists()) {
            docsFolder.mkdir();
            Log.i(TAG, "Created a new directory for PDF");
        }

        comprovante = new File(docsFolder.getAbsolutePath(),"comprovante.pdf");

Tentativa de carregar o arquivo

            Intent intent = new Intent();
            intent.setAction(Intent.ACTION_VIEW);
            Uri uri = FileProvider.getUriForFile(ComprasComprovanteActivity.this, BuildConfig.APPLICATION_ID + ".provider",comprovante);

O erro

Failed to find configured root that contains /storage/emulated/0/compras/comprovante.pdf

Tentei mudar algumas coisas mas continua o problema

Criação do pdf mudei o modo de buscar o caminho do arquivo.

        File docsFolder = new File(this.getExternalFilesDir(null) + "/compras");
        if (!docsFolder.exists()) {
            docsFolder.mkdir();
            Log.i(TAG, "Created a new directory for PDF");
        }

        comprovante = new File(docsFolder.getAbsolutePath(),"comprovante.pdf");

Ao carregar o arquivo

Uri uri = getUriForFile(ComprasComprovanteActivity.this, "sistema.com.br",comprovante);

Ao criar o arquivo ele gera no caminho:

/storage/emulated/0/Android/data/sistema.com.br/files/compras/comprovante.pdf

E ao carregar ele tenta carregar :

content://sistema.com.br/files/compras/comprovante.pdf

Mas no app da mensagem que o arquivo nao foi encontrado e no log da msg

Permission Denial: reading android.support.v4.content.FileProvider uri content://sistema.com.br/files/compras/comprovante.pdf from pid=10369, uid=10145 requires the provider be exported, or grantUriPermission()

Eu não estou sabendo mais como resolver

solução!

Depois de muita pesquisa, confusão e raiva eu resolvi simplesmente colocando dois atributos de permissão no intent.

            intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

sei que é difícil o pessoal responder na hora, mas como estava com pressa fiquei o dia inteiro nisso. mais um aprendizado