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());
}
}
}
Sim em versoes mais recentes do android ele nao abre o arquivo pdf
mas gera erro?? Se sim, qual?
android.os.FileUriExposedException: file:///storage/emulated/0/pedido.pdf exposed beyond app through Intent.getData()
esse é o erro gerado.
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
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.
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"?>