2015-06-24 57 views
1

這是我的問題。本機android pdfreader無法正常顯示

當我在第三方pdf閱讀器中打開pdf時,它正常顯示。

enter image description here

但是當我打開使用它無法正常顯示android原生pdf閱讀器的PDF文件。

它示出了作爲

enter image description here

這裏是代碼

ShowPDFActivity.java

public class ShowPDFActivity extends Activity { 

    public static final String FRAGMENT_PDF_RENDERER_BASIC = "pdf_renderer_basic"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_pdf_container); 

     Intent in = getIntent(); 

     //String filepath = in.getExtras().getString("filepath"); 
     File f = (File)in.getExtras().get("file"); 
     if (savedInstanceState == null) { 
      getFragmentManager().beginTransaction() 
        .add(R.id.container, new PdfRendererBasicFragment(f), 
          FRAGMENT_PDF_RENDERER_BASIC) 
        .commit(); 
     } 
    } 

PDFRendererBasicFragment.java

public class PdfRendererBasicFragment extends Fragment implements View.OnClickListener { 
 

 
    
 
    private static final String STATE_CURRENT_PAGE_INDEX = "current_page_index"; 
 
    private ParcelFileDescriptor mFileDescriptor; 
 
    private PdfRenderer mPdfRenderer; 
 
    private PdfRenderer.Page mCurrentPage; 
 
    private TouchImageView mImageView; 
 
    private Button mButtonPrevious; 
 
    private Button mButtonNext; 
 
    private String filepath; 
 
    private File file; 
 

 
    public PdfRendererBasicFragment(File file) 
 
    { 
 
    \t //this.filepath = filepath; 
 
    \t this.file = file; 
 
    } 
 

 
    @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); 
 
     
 
     mImageView = (TouchImageView) view.findViewById(R.id.image); 
 
     mButtonPrevious = (Button) view.findViewById(R.id.previous); 
 
     mButtonNext = (Button) view.findViewById(R.id.next); 
 
     mButtonPrevious.setOnClickListener(this); 
 
     mButtonNext.setOnClickListener(this); 
 
     // Show the first page by default. 
 
     int index = 0; 
 
     
 
     if (null != savedInstanceState) { 
 
      index = savedInstanceState.getInt(STATE_CURRENT_PAGE_INDEX, 0); 
 
     } 
 
     showPage(index); 
 
    } 
 

 
    @Override 
 
    public void onAttach(Activity activity) { 
 
     super.onAttach(activity); 
 
     try { 
 
      openRenderer(activity); 
 
     } catch (IOException e) { 
 
      e.printStackTrace(); 
 
      Toast.makeText(activity, "Error! " + e.getMessage(), Toast.LENGTH_SHORT).show(); 
 
      activity.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 { 
 
     
 
    \t Log.d("FILE :",""+Environment.getExternalStorageDirectory()); 
 
    \t //File f = new File(Environment.getExternalStorageDirectory()+"/Dec_Newsletter.pdf"); 
 
    \t //Toast.makeText(getActivity(), "Filepath "+filepath, Toast.LENGTH_LONG).show(); 
 
    \t //File f = new File(filepath); 
 
    \t //Log.d("File :", "File :"+f); 
 
     mFileDescriptor = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY); 
 
    
 
     mPdfRenderer = new PdfRenderer(mFileDescriptor); 
 
    } 
 

 
    
 
    private void closeRenderer() throws IOException { 
 
     if (null != mCurrentPage) { 
 
      mCurrentPage.close(); 
 
     } 
 
     mPdfRenderer.close(); 
 
     mFileDescriptor.close(); 
 
    } 
 

 
    
 
    private void showPage(int index) { 
 
     if (mPdfRenderer.getPageCount() <= index) { 
 
      return; 
 
     } 
 
     
 
     if (null != mCurrentPage) { 
 
      mCurrentPage.close(); 
 
     } 
 
     
 
     mCurrentPage = mPdfRenderer.openPage(index); 
 
     
 
     Bitmap bitmap = Bitmap.createBitmap(mCurrentPage.getWidth()*2, mCurrentPage.getHeight()*2, 
 
       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); 
 
     bitmap.setHasAlpha(true); 
 
     bitmap.setHasMipMap(true); 
 
     // We are ready to show the Bitmap to user. 
 
     mImageView.setImageBitmap(bitmap); 
 
     saveBitmapTpSdCard(bitmap,"testimage"); 
 
     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(0, 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 saveBitmapTpSdCard(Bitmap bitmap, String fileName) { 
 
     ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
 
     bitmap.compress(Bitmap.CompressFormat.PNG, 40, bytes); 
 

 
     File f = new File(Environment.getExternalStorageDirectory() 
 
       + File.separator + getString(R.string.app_name)); 
 

 
     try { 
 
      if(!f.exists()) { 
 
       f.mkdirs(); 
 
      } 
 
      File imageFile = new File(f, fileName + ".png"); 
 
      FileOutputStream fo = new FileOutputStream(imageFile); 
 
      fo.write(bytes.toByteArray()); 
 
      fo.close(); 
 
     } catch (IOException e) { 
 
      e.printStackTrace(); 
 
     } 
 
    } 
 

 
}

回答

0

我找到簡單的答案花費幾個小時後...

在Android清單文件,它是

<uses-sdk android:minSdkVersion="8"/> 

在Android清單文件中,你需要包括

<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21"/>