1

「Download/Adobe Reader/answerkey.pdf」に保存されている「answerkey.pdf」というPDFをレンダリングするために使用しているコードは次のとおりです

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 カードがありません。または、ビットマップに何か問題がありますか?

4

1 に答える 1

0

パスが間違っていませんか?

はい。

デバイスに SD カードがありません

それは結構です。それがリムーバブル ストレージです。「Download/Adobe Reader/answerkey.pdf」は、外部ストレージ上の何かを参照していると解釈しています。

この場所を取得するための推奨される方法は、次のものを置き換えることです。

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パーミッションをリクエストする必要があり、これにはAndroid 6.0+ のランタイム パーミッションtargetSdkVersionが含まれることに注意してください ( 23 以上の場合)。

于 2016-11-10T20:52:07.393 に答える