Cómo abrir un PDF a través de Intent desde la tarjeta SD

Estoy intentando lanzar una Intent para abrir un pdf dentro de mi carpeta de activos en mi aplicación. He leído docenas de publicaciones pero aún estoy atascado. Aparentemente, necesito copiar el pdf a la tarjeta sd primero y luego ejecutar Intent . Todavía no funciona.

Creo que el problema es el lanzamiento Intent así que simplemente estoy tratando de abrir un archivo “example.pdf” que copié en la tarjeta SD usando este código:

 Log.w("IR", "TRYING TO RENDER: " + Environment.getExternalStorageDirectory().getAbsolutePath()+"/example.pdf"); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.parse(Environment.getExternalStorageDirectory().getAbsolutePath()+"/example.pdf"), "application/pdf"); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); try { startActivity(intent); Log.e("IR", "No exception"); } catch (ActivityNotFoundException e) { Log.e("IR", "error: " + e.getMessage()); Toast.makeText(InvestorRelations.this, "No Application Available to View PDF", Toast.LENGTH_SHORT).show(); } 

Esta es mi salida de LogCat.

 05-10 10:35:10.950: W/IR(4508): TRYING TO RENDER: /mnt/sdcard/example.pdf 05-10 10:35:10.960: E/IR(4508): No exception 

Excepto cuando se ejecuta este código, obtengo el siguiente Toast (no producido por mi aplicación)

“No es un tipo de documento compatible”

Pero puedo abrir el documento manualmente a través de la aplicación de visualización de PDF instalada. Cualquier ayuda sería muy apreciada.

Pruebe este código, muestre el archivo pdf de / sdcard

 File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/example.pdf"); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(file), "application/pdf"); intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); startActivity(intent); 

Descargue el código fuente desde aquí ( Abrir archivo pdf desde sdcard en Android programáticamente )

Agrega esta dependencia:

 compile 'com.github.barteksc:android-pdf-viewer:2.0.3' 

activity_main.xml:

      

MainActivity.java:

 package com.pdffilefromsdcard; import android.Manifest; import android.app.ProgressDialog; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Environment; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; import android.widget.Toast; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; public class MainActivity extends AppCompatActivity { ListView lv_pdf; public static ArrayList fileList = new ArrayList(); PDFAdapter obj_adapter; public static int REQUEST_PERMISSIONS = 1; boolean boolean_permission; File dir; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } private void init() { lv_pdf = (ListView) findViewById(R.id.lv_pdf); dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath()); fn_permission(); lv_pdf.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView adapterView, View view, int i, long l) { Intent intent = new Intent(getApplicationContext(), PdfActivity.class); intent.putExtra(“position”, i); startActivity(intent); Log.e(“Position”, i + “”); } }); } public ArrayList getfile(File dir) { File listFile[] = dir.listFiles(); if (listFile != null && listFile.length > 0) { for (int i = 0; i < listFile.length; i++) { if (listFile[i].isDirectory()) { getfile(listFile[i]); } else { boolean booleanpdf = false; if (listFile[i].getName().endsWith(“.pdf”)) { for (int j = 0; j < fileList.size(); j++) { if (fileList.get(j).getName().equals(listFile[i].getName())) { booleanpdf = true; } else { } } if (booleanpdf) { booleanpdf = false; } else { fileList.add(listFile[i]); } } } } } return fileList; } private void fn_permission() { if ((ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) { if ((ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, android.Manifest.permission.READ_EXTERNAL_STORAGE))) { } else { ActivityCompat.requestPermissions(MainActivity.this, new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_PERMISSIONS); } } else { boolean_permission = true; getfile(dir); obj_adapter = new PDFAdapter(getApplicationContext(), fileList); lv_pdf.setAdapter(obj_adapter); } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_PERMISSIONS) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { boolean_permission = true; getfile(dir); obj_adapter = new PDFAdapter(getApplicationContext(), fileList); lv_pdf.setAdapter(obj_adapter); } else { Toast.makeText(getApplicationContext(), “Please allow the permission”, Toast.LENGTH_LONG).show(); } } } } 

activity_pdf.xml:

     

PdfActivity.java:

paquete com.pdffilefromsdcard;

 import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.util.Log; import com.github.barteksc.pdfviewer.PDFView; import com.github.barteksc.pdfviewer.listener.OnLoadCompleteListener; import com.github.barteksc.pdfviewer.listener.OnPageChangeListener; import com.github.barteksc.pdfviewer.scroll.DefaultScrollHandle; import com.shockwave.pdfium.PdfDocument; import java.io.File; import java.util.List; public class PdfActivity extends AppCompatActivity implements OnPageChangeListener,OnLoadCompleteListener { PDFView pdfView; Integer pageNumber = 0; String pdfFileName; String TAG=”PdfActivity”; int position=-1; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_pdf); init(); } private void init(){ pdfView= (PDFView)findViewById(R.id.pdfView); position = getIntent().getIntExtra(“position”,-1); displayFromSdcard(); } private void displayFromSdcard() { pdfFileName = MainActivity.fileList.get(position).getName(); pdfView.fromFile(MainActivity.fileList.get(position)) .defaultPage(pageNumber) .enableSwipe(true) .swipeHorizontal(false) .onPageChange(this) .enableAnnotationRendering(true) .onLoad(this) .scrollHandle(new DefaultScrollHandle(this)) .load(); } @Override public void onPageChanged(int page, int pageCount) { pageNumber = page; setTitle(String.format(“%s %s / %s”, pdfFileName, page + 1, pageCount)); } @Override public void loadComplete(int nbPages) { PdfDocument.Meta meta = pdfView.getDocumentMeta(); printBookmarksTree(pdfView.getTableOfContents(), “-“); } public void printBookmarksTree(List tree, String sep) { for (PdfDocument.Bookmark b : tree) { Log.e(TAG, String.format(“%s %s, p %d”, sep, b.getTitle(), b.getPageIdx())); if (b.hasChildren()) { printBookmarksTree(b.getChildren(), sep + “-“); } } } } 

¡Gracias!

Para Android Nougat y la versión anterior de Android, hay que trabajar un poco más, de lo contrario, la aplicación no podrá abrir el archivo .pdf . Tenemos que establecer un permiso temporal para URI usando FileProvider

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { File file=new File(mFilePath); Uri uri = FileProvider.getUriForFile(this, getPackageName() + ".provider", file); intent = new Intent(Intent.ACTION_VIEW); intent.setData(uri); intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); startActivity(intent); } else { intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.parse(mFilePath), "application/pdf"); intent = Intent.createChooser(intent, "Open File"); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } 

La respuesta aceptada está desactualizada ahora. Use FileProvider para compartir archivos .

Puede tener algo que ver con el hecho de que los archivos en la carpeta de activos se comprimen.

Intente moverlo a su carpeta res/raw/ .

Más información: https://stackoverflow.com/a/4432804/413127