2016-11-10 10 views
0

Вот код, я использую для визуализации PDF под названием «answerkey.pdf», которая хранится в «Download/Adobe Reader/answerkey.pdf»Класс визуализации PDF не рендеринг PDF на Android SDK 21

package com.practice.pdftest; 

import android.app.Activity; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.Matrix; 
import android.graphics.Rect; 
import android.graphics.pdf.PdfRenderer; 
import android.os.Environment; 
import android.os.ParcelFileDescriptor; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.IOException; 

public class MainActivity extends Activity { 


    private ImageView imageView; 
    private Button next, previous; 
    private TextView tv; 
    private int currentPage = 0; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     next = (Button)findViewById(R.id.next); 
     next.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       currentPage++; 
       render(); 
      } 
     }); 

     previous = (Button)findViewById(R.id.previous); 
     previous.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       currentPage--; 
       render(); 
      } 
     }); 
//  tv = (TextView)findViewById(R.id.testText); 
//  tv.setText(Environment.getExternalStorageDirectory().getAbsolutePath()); 
// 
//  Toast toast = Toast.makeText(getApplicationContext(),Environment.getExternalStorageDirectory().getAbsolutePath(),Toast.LENGTH_LONG); 
//  toast.show(); 
    } 

    private void render() { 
     try { 
      imageView = (ImageView)findViewById(R.id.imageView); 

      int REQ_WIDTH = 1; 
      int REQ_HEIGHT = 1; 

      REQ_WIDTH = imageView.getWidth(); 
      REQ_HEIGHT = imageView.getHeight(); 
      Bitmap bitmap = Bitmap.createBitmap(REQ_WIDTH, REQ_HEIGHT, Bitmap.Config.ARGB_4444); 
      File file = new File(Environment.getDataDirectory().getPath()+"Adobe Reader/answerkey.pdf"); 
      PdfRenderer pdfRenderer = new PdfRenderer(ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY)); 
      if(currentPage < 0) { 
       currentPage=0; 
      } 
      else if (currentPage > pdfRenderer.getPageCount()) { 
       currentPage = pdfRenderer.getPageCount()-1; 
      } 

      Matrix matrix = imageView.getImageMatrix(); 
      Rect rect = new Rect(0,0,REQ_HEIGHT,REQ_WIDTH); 
      pdfRenderer.openPage(currentPage).render(bitmap,rect,matrix,PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY); 
      imageView.setImageMatrix(matrix); 
      imageView.setImageBitmap(bitmap); 
      imageView.invalidate(); 


     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Вот layout.xml файл я сделал -

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    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" 
    android:orientation="vertical" 
    tools:context="com.practice.pdftest.MainActivity"> 

    <ImageView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/imageView" 
     android:layout_weight="4" 
     android:background="@android:color/white" 
     android:layout_marginBottom="20dp" 
     /> 
    <!--<TextView--> 
     <!--android:layout_width="wrap_content"--> 
     <!--android:layout_height="wrap_content"--> 
     <!--android:id="@+id/testText"--> 
     <!--android:text="Test"--> 

     <!--/>--> 
    <LinearLayout 
     android:layout_width="match_parent" 
     android:orientation="horizontal" 
     android:layout_weight="2" 
     android:gravity="center" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="-100dp"> 

     <Button 
      android:id="@+id/previous" 
      android:layout_width="200dp" 
      android:layout_height="wrap_content" 
      android:text="Previous" 
      /> 

     <Button 
      android:id="@+id/next" 
      android:layout_width="200dp" 
      android:layout_height="wrap_content" 
      android:text="Next" /> 

    </LinearLayout> 
</LinearLayout> 

по какой-то причине, PDF просто не отображается на экране, я получаю белый, чистый фон. Что я делаю не так? Неправильный путь? У меня нет SD-карты на моем устройстве. Или я делаю что-то неправильно с растровым изображением?

ответ

0

Ошибка:

Да.

У меня нет SD-карты на устройстве

Это нормально. Это будет removable storage. Я интерпретирую «Download/Adobe Reader/answerkey.pdf» как ссылку на что-то на external storage.

Рекомендуемый способ, чтобы получить это место было бы заменить:

File file = new File(Environment.getDataDirectory().getPath()+"Adobe Reader/answerkey.pdf"); 

с:

File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "Adobe Reader/answerkey.pdf"); 

Обратите внимание, что ваше приложение нужно будет запрашивать разрешение на READ_EXTERNAL_STORAGE или WRITE_EXTERNAL_STORAGE, и будет включать в себя runtime permissions на Android 6.0+ (если ваш targetSdkVersion - 23 или выше).