Vizualizar PDF android

8 respostas Resolvido
androidjava
M

Ola estou tentando ler um arquivo PDF que esta gravado na pasta raiz de um dispositivo android, mas nao esta abrindo, alguem consegue me ajudar? Segue meu codigo:

public void visualizarPedido(){

@SuppressWarnings("deprecation")
	File pdfFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + "pedido.pdf"); 
    if(pdfFile.exists()) 
    {
    	Intent pdfIntent = new Intent();
    	pdfIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);	
		Path = Uri.fromFile(pdfFile);
        pdfIntent.setType("application/pdf");
        pdfIntent.setData(Path);
        pdfIntent.putExtra("", Path);
        pdfIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

        try
        {
            startActivity(pdfIntent); 
            VisualizarPedido.super.onBackPressed();
                     
        }
        catch(ActivityNotFoundException e)
        {
        	
        	final AlertDialog.Builder b = new AlertDialog.Builder(this);
    		alert = b.setCancelable(false).setPositiveButton("OK", new OnClickListener() {
    			@Override
    			public void onClick(DialogInterface dialog, int which) {
    				alert.dismiss();
    				
    				VisualizarPedido.super.onBackPressed();

    			}
    		}).setMessage("Nenhum Programa para Visualizar Arquivo em PDF Instalado!").create();

    		alert.show();
        }
        catch(Exception e) {
        	Log.e("ERRO", e.getMessage());
        }
    }
}

8 Respostas

R

ta dando erro?

M

Sim em versoes mais recentes do android ele nao abre o arquivo pdf

R

mas gera erro?? Se sim, qual?

M

android.os.FileUriExposedException: file:///storage/emulated/0/pedido.pdf exposed beyond app through Intent.getData()
esse é o erro gerado.

R
M

Minha classe esta assim agora:
public void visualizarPedido(){

int SDK_INT = android.os.Build.VERSION.SDK_INT;
    	Intent pdfIntent = new Intent();
        String caminhoPdf = getExternalFilesDir(null) + "/" + System.currentTimeMillis() + "pedido.pdf";
        File pdf = new File(caminhoPdf);
        Uri pdfURI = FileProvider.getUriForFile(VisualizarPedido.this, BuildConfig.APPLICATION_ID + ".provider", pdf);
        pdfIntent.putExtra(MediaStore.EXTRA_OUTPUT, pdfURI);
       

        try
        {
            startActivity(pdfIntent); 
            VisualizarPedido.super.onBackPressed();
                     
        }
        catch(ActivityNotFoundException e)
        {
        	
        	final AlertDialog.Builder b = new AlertDialog.Builder(this);
    		alert = b.setCancelable(false).setPositiveButton("OK", new OnClickListener() {
    			@Override
    			public void onClick(DialogInterface dialog, int which) {
    				alert.dismiss();
    				
    				VisualizarPedido.super.onBackPressed();

    			}
    		}).setMessage("Nenhum Programa para Visualizar Arquivo em PDF Instalado!").create();

    		alert.show();
        }
        catch(Exception e) {
        	Log.e("ERRO", e.getMessage());
        }
    }

Porem esta retornando esse erro agora: java.lang.NullPointerException: Attempt to invoke virtual method ‘android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)’ on a null object reference

M

Fiz umas alterações no meu xml e a classe esta assim agora:
public void visualizarPedido(){

String caminhoPdf = getExternalFilesDir(null) + "/" + "pedido.pdf";
        File pdf = new File(caminhoPdf);
        Uri pdfURI = FileProvider.getUriForFile(VisualizarPedido.this, BuildConfig.APPLICATION_ID + ".provider", pdf);
        Intent pdfIntent = new Intent(Intent.ACTION_VIEW, pdfURI);
        pdfIntent.putExtra("", pdfURI);
       

        try
        {
            startActivity(pdfIntent); 
            VisualizarPedido.super.onBackPressed();
                     
        }
        catch(ActivityNotFoundException e)
        {
        	
        	final AlertDialog.Builder b = new AlertDialog.Builder(this);
    		alert = b.setCancelable(false).setPositiveButton("OK", new OnClickListener() {
    			@Override
    			public void onClick(DialogInterface dialog, int which) {
    				alert.dismiss();
    				
    				VisualizarPedido.super.onBackPressed();

    			}
    		}).setMessage("Nenhum Programa para Visualizar Arquivo em PDF Instalado!").create();

    		alert.show();
        }
        catch(Exception e) {
        	Log.e("ERRO", e.getMessage());
        }
    }

parece estar funcionando porque ele esta chamando o visualizador pdf do celular, mas fica em branco e se eu for na pasta que foi gravado o pdf ele esta la e abre normalmente e nao esta em branco.

M
Solucao aceita

Consegui resolver o problema, minha classe ficou assim:

public void visualizarPedido(){
	
	String caminhoPdf = Environment.getExternalStorageDirectory() + "/"  + "pedido.pdf";
	File pdf = new File(caminhoPdf);
	
	if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {  

			pdfURI = FileProvider.getUriForFile(this, getPackageName() + ".provider", pdf);
       
        
        }else {
        	
        	pdfURI = Uri.fromFile(pdf);
        	
        }
	 Intent pdfIntent = new Intent(Intent.ACTION_VIEW);
     pdfIntent.setData(pdfURI);
     pdfIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);	
       

        try
        {
            startActivity(pdfIntent); 
            VisualizarPedido.super.onBackPressed();
                     
        }
        catch(ActivityNotFoundException e)
        {
        	
        	final AlertDialog.Builder b = new AlertDialog.Builder(this);
    		alert = b.setCancelable(false).setPositiveButton("OK", new OnClickListener() {
    			@Override
    			public void onClick(DialogInterface dialog, int which) {
    				alert.dismiss();
    				
    				VisualizarPedido.super.onBackPressed();

    			}
    		}).setMessage("Nenhum Programa para Visualizar Arquivo em PDF Instalado!").create();

    		alert.show();
        }
        catch(Exception e) {
        	Log.e("ERRO", e.getMessage());
        }
    }

Precisa adicionar essas linhas dentro de application no manifest:



e criar um xml com o nome de filepaths, e adicionar esse codigo no mesmo:

<?xml version="1.0" encoding="utf-8"?>
Criado 1 de julho de 2020
Ultima resposta 7 de jul. de 2020
Respostas 8
Participantes 2