¿Cómo abrir un PDF almacenado en la carpeta res / raw o assets?

Voy a mostrar un pdf en mi aplicación, y el pdf tiene que ser incluido con la aplicación.

¿Cuál es una buena manera de hacer esto?

He leído que podría ser posible al agregar el archivo pdf a una carpeta res / raw y leerlo desde allí, pero obtengo errores del proyecto cuando coloco el archivo pdf allí.

Así que traté de poner el archivo pdf en la carpeta de activos del proyecto, y no dio ningún error.

Así es como he tratado de mostrar el pdf:

File pdfFile = new File("res/raw/file.pdf"); Uri path = Uri.fromFile(pdfFile); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(path, "application/pdf"); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

Alguna idea o sugerencia?

Gracias por adelantado

Podrías mostrarlo sin raw/ o assets/ si tu aplicación realmente implementó un lector de PDF. Como desea que se muestre en una aplicación separada (como Adobe Reader), le sugiero que haga lo siguiente:

  1. Almacene el archivo PDF en el directorio assets/ .
  2. Cuando el usuario quiera verlo, cópielo en algún lugar público . Mire en openFileOutput o getExternalFilesDir .
  3. Inicie el Intent tal como lo hace ahora, excepto el uso de getAbsolutePath() en el archivo recién creado para los datos del bash.

Tenga en cuenta que un usuario puede no tener una aplicación de lectura de PDF. En este caso, es útil capturar la ActivityNotFoundException y mostrar un mensaje apropiado.

No puede abrir el archivo pdf directamente desde la carpeta de activos . Primero debe escribir el archivo en la tarjeta SD desde la carpeta de activos y luego leerlo desde la tarjeta SD. El código es el siguiente:

  @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); File fileBrochure = new File(Environment.getExternalStorageDirectory() + "/" + "abc.pdf"); if (!fileBrochure.exists()) { CopyAssetsbrochure(); } /** PDF reader code */ File file = new File(Environment.getExternalStorageDirectory() + "/" + "abc.pdf"); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(file),"application/pdf"); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); try { getApplicationContext().startActivity(intent); } catch (ActivityNotFoundException e) { Toast.makeText(SecondActivity.this, "NO Pdf Viewer", Toast.LENGTH_SHORT).show(); } } //method to write the PDFs file to sd card private void CopyAssetsbrochure() { AssetManager assetManager = getAssets(); String[] files = null; try { files = assetManager.list(""); } catch (IOException e) { Log.e("tag", e.getMessage()); } for(int i=0; i 

Eso es todo ... ¡Disfruta! y por favor no te olvides de dar + 1.Gracias

He utilizado el siguiente formato para abrir recursos sin procesar desde mi propia aplicación. No he probado si otra aplicación puede abrir su recurso sin procesar.

 Uri path = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.myPdfName); 

Su intención de PDF parece buena, pero debe intentar esto para obtener el Uri del archivo en la carpeta sin formato:

 Uri path = Uri.parse("android.resource:///raw/"); 

(Fuente)

Tuve varios problemas con las respuestas, así que armé algo que funciona.

DISEÑO

      

CÓDIGO

 /** * Render a page of a PDF into ImageView * @param targetView * @throws IOException */ private void openPDF(ImageView targetView) throws IOException { //open file in assets ParcelFileDescriptor fileDescriptor; String FILENAME = "your.pdf"; // Create file object to read and write on File file = new File(getActivity().getCacheDir(), FILENAME); if (!file.exists()) { AssetManager assetManager = getActivity().getAssets(); FileUtils.copyAsset(assetManager, FILENAME, file.getAbsolutePath()); } fileDescriptor = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY); PdfRenderer pdfRenderer = new PdfRenderer(fileDescriptor); //Display page 0 PdfRenderer.Page rendererPage = pdfRenderer.openPage(0); int rendererPageWidth = rendererPage.getWidth(); int rendererPageHeight = rendererPage.getHeight(); Bitmap bitmap = Bitmap.createBitmap( rendererPageWidth, rendererPageHeight, Bitmap.Config.ARGB_8888); rendererPage.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY); targetView.setImageBitmap(bitmap); rendererPage.close(); pdfRenderer.close(); } public static boolean copyAsset(AssetManager assetManager, String fromAssetPath, String toPath) { InputStream in = null; OutputStream out = null; try { in = assetManager.open(fromAssetPath); new File(toPath).createNewFile(); out = new FileOutputStream(toPath); copyFile(in, out); in.close(); in = null; out.flush(); out.close(); out = null; return true; } catch(Exception e) { e.printStackTrace(); return false; } } public static void copyFile(InputStream in, OutputStream out) throws IOException { byte[] buffer = new byte[1024]; int read; while((read = in.read(buffer)) != -1){ out.write(buffer, 0, read); } } 

mis aplicaciones necesitan abrir un contenido de archivo pdf en los datos brutos en la aplicación externa … im write:

 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button = (Button) findViewById(R.id.OpenPdfButton); button.setOnClickListener(new View.OnClickListener() { InputStream is = getResources().openRawResource(R.raw.filepdf); @Override public void onClick(View v) { startpdf(); } private void startpdf() { // TODO Auto-generated method stub File file = new File("R.id.filepdf"); if (file.exists()) { Uri path = Uri.fromFile(file); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(path, "application/pdf"); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); try { startActivity(intent); } catch (ActivityNotFoundException e) { } } } }); } }