2016-05-26 1 views
0

ich in beiden Fällen auf dieser Aufgabe versagt:Wie PDF auf Android machen PdfRenderer mit

1. Der Versuch, es aus dem Telefonspeicher zu öffnen
2. Der Versuch, es von der öffnen Vermögenswerte

ich habe render() Methode, die in 1. Fall ist, die wie folgt aus:

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

     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.getExternalStorageDirectory() + "/Download/test.pdf"); 

     PdfRenderer renderer = new PdfRenderer(ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY)); 

     if (currentPage < 0) { 
      currentPage = 0; 
     } else if (currentPage > renderer.getPageCount()) { 
      currentPage = renderer.getPageCount() - 1; 
     } 

     Matrix matrix = imageView.getImageMatrix(); 
     Rect rect = new Rect(0, 0, REQ_WIDTH, REQ_HEIGHT); 

     renderer.openPage(currentPage).render(bitmap, rect, matrix, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY); 

     imageView.setImageMatrix(matrix); 
     imageView.setImageBitmap(bitmap); 
     imageView.invalidate(); 
     renderer.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
} 

Der interessanteste Teil der geworfenen Ausnahme is here. Wenn Sie ganze Logs sehen wollen click here.

Und ja, ich habe hinzugefügt benötigt Erlaubnis in AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.john.pdfreader"> 

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

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name=".BookActivity"> 
      <intent-filter> 
        <action android:name="com.example.itatriev.schoolreader.BookActivity" /> 

       <category android:name="android.intent.category.DEFAULT" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

Lassen Sie sich auf dem 2. Fall einen Blick (aus dem Vermögen zu lesen):

// ...previous code 
ParcelFileDescriptor input = getAssets().openFd("test.pdf").getParcelFileDescriptor(); 
PdfRenderer renderer = new PdfRenderer(input); 
// ..previous code 

In diesem Fall es sagt das selbe, aber wenn ich mich richtig erinnere, gab es smth, cannot create document sagend, aber jetzt ist es weg und Ausnahme sieht das selbe aus. Wie auch immer, warum begann ich über den zweiten Fall zu sprechen? There's an open issue sagen, dass META-INF sollte am Ende der apk sein. Meins ist am Ende und es funktioniert immer noch nicht.

Ehrlich gesagt habe ich sogar ein Beispiel aus Androidstudio selbst ausprobiert. Und weisst du was? Es funktioniert! Aber nur mit ihrer sample.pdf und wenn ich versuche, es durch meine zu ersetzen, stürzt es einfach ab. Hast du eine Idee, was ich versuchen kann, um PDF-Rendering auf meinem Android zu machen?

Alles wurde auf Nexus 5, Android 6.0 Marshmallow getestet.

Antwort

1

Zusätzlich zur Berechtigung im Manifest müssen Sie möglicherweise explizit um Erlaubnis fragen. Etwas wie:

int permission = ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE); 

if (permission != PackageManager.PERMISSION_GRANTED) 
{ 
    // We don't have permission so prompt the user 
    ActivityCompat.requestPermissions(getActivity(), PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE); 
}