从资产文件夹中读取pdf文件

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); } } 

我想从我的应用程序文件夹中的资产文件夹中读取pdf文件。 一切正常工作,当我点击我的DOCSbuttonpopup来让我select一个应用程序打开PDF即“abc.pdf”,但select一个选项后,我得到一个错误消息“文件path无效”。 我认为他们是我在代码中指定的path的一些问题。 请帮忙

尝试这个

 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); } } } 

确保包括

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

在清单中

像说sunsil ,但在外部目录的情况下。

 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); } } } 

改变这些代码的一部分:

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

前面的例子是用于Pdfs的,例如.txt

 FileOutputStream fos = new FileOutputStream(file); 

尽pipe已经得到了答复,但我想分享我的解决scheme,因为我觉得包含起来要容易一些。

用法:

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

这里是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); } } } 
 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. 

如果你想打开一个本地存储在资产文件夹中的.pdf文件而不使用Intent来启动外部应用程序,我build议使用Android类PdfRenderer。 文档在这里find。

这是一个很好的例子,为我工作。

但是,这个例子在下载时不会运行。 我不得不改变它,使用其他答案中提到的copyReadAssets()函数,然后引用该文件(在它被复制后)我使用:

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

我也最终修改onAttach(),因为它使用了onAttach()和closeRenderer()的弃用forms,因为它抛出了closuresnull对象的错误。

所以我完整的PdfRendererBasicFragment.java文件如下所示:

 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); } } } 

尝试这个:

 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(); }