Leer un archivo pdf desde la carpeta de activos

public void DOCS(View btnDocs) { File fileBrochure = new File("android.resource://com.project.datastructure/assets/abc.pdf"); if (!fileBrochure.exists()) { CopyAssetsbrochure(); } /** PDF reader code */ File file = new File("android.resource://com.project.datastructure/assets/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(Stack_dr.this, "NO Pdf Viewer", Toast.LENGTH_SHORT).show(); } } private void CopyAssetsbrochure() { AssetManager assetManager = getAssets(); String[] files = null; try { files = assetManager.list(""); } catch (IOException e){} for(int i=0; i<files.length; i++) { String fStr = files[i]; if(fStr.equalsIgnoreCase("abc.pdf")) { InputStream in = null; OutputStream out = null; try { in = assetManager.open(files[i]); out = new FileOutputStream("/sdcard/" + files[i]); copyFile(in, out); in.close(); in = null; out.flush(); out.close(); out = null; break; } catch(Exception e){} } } } private 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); } } 

Estoy tratando de leer un archivo pdf de la carpeta de activos que está presente en mi carpeta de la aplicación. Todo está funcionando perfectamente cuando hago clic en mi botón DOCS un pop-up viene a dejarme elegir una aplicación para abrir el pdf, es decir, "abc.pdf", pero después de seleccionar una opción obtengo un mensaje de error "La ruta del archivo no es válida". Creo que es un problema con la ruta que he especificado en el código. por favor ayuda

Prueba esto

 public class SampleActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); CopyReadAssets(); } private void CopyReadAssets() { AssetManager assetManager = getAssets(); InputStream in = null; OutputStream out = null; File file = new File(getFilesDir(), "abc.pdf"); try { in = assetManager.open("abc.pdf"); out = openFileOutput(file.getName(), Context.MODE_WORLD_READABLE); copyFile(in, out); in.close(); in = null; out.flush(); out.close(); out = null; } catch (Exception e) { Log.e("tag", e.getMessage()); } Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType( Uri.parse("file://" + getFilesDir() + "/abc.pdf"), "application/pdf"); startActivity(intent); } private 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); } } } 

Asegúrese de incluir

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

En manifiesto

Como decir sunsil , pero en el caso de directorio externo.

 import android.app.Activity; import android.content.Intent; import android.content.res.AssetManager; import android.net.Uri; import android.os.Environment; import android.os.Bundle; import android.util.Log; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); copyReadAssets(); } private void copyReadAssets() { AssetManager assetManager = getAssets(); InputStream in = null; OutputStream out = null; String strDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)+ File.separator + "Pdfs"; File fileDir = new File(strDir); fileDir.mkdirs(); // crear la ruta si no existe File file = new File(fileDir, "example2.pdf"); try { in = assetManager.open("example.pdf"); //leer el archivo de assets out = new BufferedOutputStream(new FileOutputStream(file)); //crear el archivo copyFile(in, out); in.close(); in = null; out.flush(); out.close(); out = null; } catch (Exception e) { Log.e("tag", e.getMessage()); } Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.parse("file://" + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + File.separator + "Pdfs" + "/example2.pdf"), "application/pdf"); startActivity(intent); } private 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); } } } 

Cambiar partes de código como estos:

 out = new BufferedOutputStream(new FileOutputStream(file)); 

El ejemplo anterior es para Pdfs, en caso de ejemplo .txt

 FileOutputStream fos = new FileOutputStream(file); 

Aunque esto ha sido contestado, quería compartir mi solución, ya que creo que es un poco más fácil de incluir.

Uso:

 new OpenLocalPDF(context, 'nameOfPDFStoredInAssets').execute() 

Y aquí está la clase OpenLocalPDF :

 public class OpenLocalPDF { private static String TAG = OpenLocalPDF.class.getSimpleName(); private WeakReference<Context> contextWeakReference; private String fileName; public OpenLocalPDF(Context context, String fileName) { this.contextWeakReference = new WeakReference<>(context); this.fileName = fileName.endsWith("pdf") ? fileName : fileName + ".pdf"; } public void execute() { Context context = contextWeakReference.get(); if (context != null) { new CopyFileAsyncTask().execute(); } } private class CopyFileAsyncTask extends AsyncTask<Void, Void, File> { final String appDirectoryName = BuildConfig.APPLICATION_ID; final File fileRoot = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_DOCUMENTS), appDirectoryName); @Override protected File doInBackground(Void... params) { Context context = contextWeakReference.get(); AssetManager assetManager = context.getAssets(); File file = new File(fileRoot, fileName); InputStream in = null; OutputStream out = null; try { file.mkdirs(); if (file.exists()) { file.delete(); } file.createNewFile(); in = assetManager.open(fileName); Log.d(TAG, "In"); out = new FileOutputStream(file); Log.d(TAG, "Out"); Log.d(TAG, "Copy file"); copyFile(in, out); Log.d(TAG, "Close"); in.close(); out.flush(); out.close(); return file; } catch (Exception e) { Log.e(TAG, e.getMessage()); } return null; } private 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); } } @Override protected void onPostExecute(File file) { super.onPostExecute(file); Context context = contextWeakReference.get(); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType( Uri.fromFile(file), "application/pdf"); context.startActivity(intent); } } } 

Si desea abrir un archivo .pdf que se almacena localmente en la carpeta de activos sin usar Intent para iniciar una aplicación externa, sugiero usar la clase de Android PdfRenderer. Documentación encontrada aquí .

Este es un buen ejemplo que funcionó para mí.

Sin embargo, este ejemplo no se ejecutará cuando lo descargué. Tuve que cambiar un poco para utilizar la función copyReadAssets () como se menciona en las otras respuestas aquí , y luego hacer referencia al archivo (después de que se ha copiado) Yo uso:

 File file = new File("/data/data/" + getContext().getPackageName() + "/files/mypdf.pdf"); 

También terminé modificando onAttach () porque estaba usando la forma obsoleta de onAttach () y closeRenderer () porque estaba lanzando errores para cerrar objetos que eran nulos.

Así que mi archivo completo de PdfRendererBasicFragment.java tiene este aspecto:

 package com.example.android.pdfrendererbasic; import android.app.Activity; import android.app.Fragment; import android.content.Context; import android.content.res.AssetManager; import android.graphics.Bitmap; import android.graphics.pdf.PdfRenderer; import android.os.Bundle; import android.os.ParcelFileDescriptor; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.ImageView; import android.widget.Toast; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; /** * This fragment has a big {@ImageView} that shows PDF pages, and 2 {@link android.widget.Button}s to move between * pages. We use a {@link android.graphics.pdf.PdfRenderer} to render PDF pages as {@link android.graphics.Bitmap}s. */ public class PdfRendererBasicFragment extends Fragment implements View.OnClickListener { /** * Key string for saving the state of current page index. */ private static final String STATE_CURRENT_PAGE_INDEX = "current_page_index"; /** * File descriptor of the PDF. */ private ParcelFileDescriptor mFileDescriptor; /** * {@link android.graphics.pdf.PdfRenderer} to render the PDF. */ private PdfRenderer mPdfRenderer; /** * Page that is currently shown on the screen. */ private PdfRenderer.Page mCurrentPage; /** * {@link android.widget.ImageView} that shows a PDF page as a {@link android.graphics.Bitmap} */ private ImageView mImageView; /** * {@link android.widget.Button} to move to the previous page. */ private Button mButtonPrevious; /** * {@link android.widget.Button} to move to the next page. */ private Button mButtonNext; public PdfRendererBasicFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_pdf_renderer_basic, container, false); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); // Retain view references. mImageView = (ImageView) view.findViewById(R.id.image); mButtonPrevious = (Button) view.findViewById(R.id.previous); mButtonNext = (Button) view.findViewById(R.id.next); // Bind events. mButtonPrevious.setOnClickListener(this); mButtonNext.setOnClickListener(this); // Show the first page by default. int index = 0; // If there is a savedInstanceState (screen orientations, etc.), we restore the page index. if (null != savedInstanceState) { index = savedInstanceState.getInt(STATE_CURRENT_PAGE_INDEX, 0); } showPage(index); } @Override public void onAttach(Context context) { super.onAttach(context); try { openRenderer(context); } catch (IOException e) { e.printStackTrace(); Toast.makeText(context, "Error! " + e.getMessage(), Toast.LENGTH_SHORT).show(); getActivity().finish(); } } @Override public void onDetach() { try { closeRenderer(); } catch (IOException e) { e.printStackTrace(); } super.onDetach(); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); if (null != mCurrentPage) { outState.putInt(STATE_CURRENT_PAGE_INDEX, mCurrentPage.getIndex()); } } /** * Sets up a {@link android.graphics.pdf.PdfRenderer} and related resources. */ private void openRenderer(Context context) throws IOException { // Copy the pdf to a usable location CopyReadAssets(); File file = new File("/data/data/" + context.getPackageName() + "/files/sample.pdf"); mPdfRenderer = new PdfRenderer(ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY)); } /** * Closes the {@link android.graphics.pdf.PdfRenderer} and related resources. * * @throws java.io.IOException When the PDF file cannot be closed. */ private void closeRenderer() throws IOException { if (mCurrentPage != null) { mCurrentPage.close(); } if (mPdfRenderer != null) { mPdfRenderer.close(); } if (mFileDescriptor != null) { mFileDescriptor.close(); } } /** * Shows the specified page of PDF to the screen. * * @param index The page index. */ private void showPage(int index) { if (mPdfRenderer.getPageCount() <= index) { return; } // Make sure to close the current page before opening another one. if (null != mCurrentPage) { mCurrentPage.close(); } // Use `openPage` to open a specific page in PDF. mCurrentPage = mPdfRenderer.openPage(index); // Important: the destination bitmap must be ARGB (not RGB). Bitmap bitmap = Bitmap.createBitmap(mCurrentPage.getWidth(), mCurrentPage.getHeight(), Bitmap.Config.ARGB_8888); // Here, we render the page onto the Bitmap. // To render a portion of the page, use the second and third parameter. Pass nulls to get // the default result. // Pass either RENDER_MODE_FOR_DISPLAY or RENDER_MODE_FOR_PRINT for the last parameter. mCurrentPage.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY); // We are ready to show the Bitmap to user. mImageView.setImageBitmap(bitmap); updateUi(); } /** * Updates the state of 2 control buttons in response to the current page index. */ private void updateUi() { int index = mCurrentPage.getIndex(); int pageCount = mPdfRenderer.getPageCount(); mButtonPrevious.setEnabled(0 != index); mButtonNext.setEnabled(index + 1 < pageCount); getActivity().setTitle(getString(R.string.app_name_with_index, index + 1, pageCount)); } /** * Gets the number of pages in the PDF. This method is marked as public for testing. * * @return The number of pages. */ public int getPageCount() { return mPdfRenderer.getPageCount(); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.previous: { // Move to the previous page showPage(mCurrentPage.getIndex() - 1); break; } case R.id.next: { // Move to the next page showPage(mCurrentPage.getIndex() + 1); break; } } } private void CopyReadAssets() { AssetManager assetManager = getActivity().getAssets(); InputStream in = null; OutputStream out = null; File file = new File(getActivity().getFilesDir(), "sample.pdf"); if(!file.exists()) { try { in = assetManager.open("sample.pdf"); out = getActivity().openFileOutput(file.getName(), Context.MODE_WORLD_READABLE); copyFile(in, out); in.close(); in = null; out.flush(); out.close(); out = null; } catch (Exception e) { Log.e("tag", e.getMessage()); } } else { Log.d("test", "file already exists"); } } private 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); } } } 
 Leider bekomme ich nichts angezeigt in meiner App. Wo und wie muss ich den Assets Ordner anlegen, oder wo muss ich die PDF `enter code here`Datei ablegen? enter code here 

enter code here

  <uses-permission `enter code here`android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

  <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> MainActivity: package de.wosi34.sampleactivity; import android.app.Activity; import android.content.Intent; import android.content.res.AssetManager; import android.net.Uri; import android.os.Environment; import android.os.Bundle; import android.util.Log; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); copyReadAssets(); } private void copyReadAssets() { AssetManager assetManager = getAssets(); InputStream in = null; OutputStream out = null; String strDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)+ File.separator + "Pdfs"; File fileDir = new File(strDir); fileDir.mkdirs(); // crear la ruta si no existe File file = new File(fileDir, "abc1.pdf"); try { in = assetManager.open("abc.pdf"); //leer el archivo de assets out = new BufferedOutputStream(new FileOutputStream(file)); //crear el archivo copyFile(in, out); in.close(); in = null; out.flush(); out.close(); out = null; } catch (Exception e) { Log.e("tag", e.getMessage()); } Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.parse("file://" + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + File.separator + "Pdfs" + "/abc1.pdf"), "application/pdf"); startActivity(intent); } private 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); } } } activity_main.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="de.wosi34.sampleactivity.MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" /> <WebView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerVertical="true" android:layout_centerHorizontal="true" /> </RelativeLayout> Es wäre nett wenn man mir weiterhelfen könnte. Ich möchte nur mehrere PDF Dateien in der App fest ablegen und sie in der App anzeigen lassen. Vielen Dank im voraus. 

prueba esto:

 public String getAssetsPdfPath(Context context) { String filePath = context.getFilesDir() + File.separator + "myFile.pdf"; File destinationFile = new File(filePath); try { FileOutputStream outputStream = new FileOutputStream(destinationFile); InputStream inputStream = context.getAssets().open("myFile.pdf"); byte[] buffer = new byte[1024]; int length = 0; while ((length = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, length); } outputStream.close(); inputStream.close(); } catch (IOException e) { Log.e(context.getClass().getSimpleName(), "Error."); } return destinationFile.getPath(); } 
  • Cómo simular la muerte de la aplicación de Android GC
  • Inicializar una aplicación de Android
  • ¿Cómo ORMlite gestiona la herencia entre clases Java?
  • Configuración de la configuración de proxy de Android mediante programación mediante el método System.Global
  • Native Crash SIGSEGV en Android JNI
  • Android Volley Null Pointer Exception
  • Problemas para cancelar un CountDownTimer Android Java
  • Escribir números fraccionarios en Java o Android
  • JAVA_HOME se establece en un directorio no válido mientras se ejecuta ./gradlew en OSX
  • ¿Qué debe saber un desarrollador antes de crear aplicaciones para teléfonos móviles?
  • ¿Hay una manera de consumir Google Play en la aplicación de productos del servidor backend?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.