如何在AlertDialog中使用PDFView打开PDF文档?

问题描述

我正在创建一个应用程序,人们可以在其中共享文档。我想以一种方式创建它,即当用户单击文档时,它会在应用程序内打开,而不是使用WPS之类的第三方应用程序下载和打开它。我希望使用AlertDialog中的PDFView打开文档。我正在使用的这段代码仅创建一个alertDialog,但不会加载PDF。关于如何加载PDF的任何想法?可以吗?

holder.postDocument.setonClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            final AlertDialog.Builder builder = new AlertDialog.Builder(mContext,R.style.AlertDialog);
            builder.setTitle("Post document");

            final String pdfUrl = "https://www.tutorialspoint.com/computer_programming/computer_programming_tutorial.pdf";
            final PDFView pdfView = new PDFView(mContext,null);
            pdfView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT));
            pdfView.fromUri(Uri.parse(post.getPostdocument() pdfUrl)).load();
            builder.setView(pdfView);

            builder.setPositiveButton("Close",new DialogInterface.OnClickListener() {
                @Override
                public void onClick(final DialogInterface dialog,int which) {
                 
                 dialog.dismiss();
                   

                }
            }).setNegativeButton("Cancel",new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog,int which) {
                    dialog.dismiss();
                }
            });

            builder.show();
        }
    });

解决方法

1-首先,您需要下载PDF文件并将其存储到手机存储中:

@SuppressLint("StaticFieldLeak")
    private class DownloadFile extends AsyncTask<String,Integer,String> {

        String savedFilePath = null;
        ProgressDialog progressDialog;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
            StrictMode.setVmPolicy(builder.build());
            progressDialog = new ProgressDialog(MainActivity.this);
            progressDialog.setTitle("Downloading PDF");
            progressDialog.setMessage("Please wait (0%)");
            progressDialog.show();
        }

        @Override
        protected String doInBackground(String... urlParams) {
            int count;
            String fileName = urlParams[1] + ".pdf";
            File storageDir = new File(
                    Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
                            + "/PDF_FOLDER/");
            boolean success = true;
            if (!storageDir.exists()) {
                success = storageDir.mkdirs();
            }
            if (success) {
                File file = new File(storageDir,fileName);
                savedFilePath = file.getAbsolutePath();
                if (!file.exists()) {
                    try {
                        URL url = new URL(urlParams[0]);
                        URLConnection conexion = url.openConnection();
                        conexion.connect();
                        int lengthOfFile = conexion.getContentLength();
                        InputStream input = new BufferedInputStream(url.openStream());
                        OutputStream output = new FileOutputStream(file);
                        byte[] data = new byte[1024];
                        long total = 0;
                        while ((count = input.read(data)) != -1) {
                            total += count;
                            publishProgress((int) (total * 100 / lengthOfFile));
                            output.write(data,count);
                        }
                        output.flush();
                        output.close();
                        input.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }

            }
            return savedFilePath;
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            progressDialog.setMessage("Please wait (" + values[0] + "%)");
        }

        @Override
        protected void onPostExecute(String pdfPath) {
            super.onPostExecute(pdfPath);
            if (pdfPath != null && !pdfPath.isEmpty()) {
                progressDialog.dismiss();
                showPDFDialog(pdfPath);
            }
        }
    }

2-下载过程完成后,在自定义对话框中显示PDF,如下所示:

  public void showPDFDialog(String pdfPath) {
        Dialog dialog = new Dialog(MainActivity.this);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        assert dialog.getWindow() != null;
        dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        dialog.setCancelable(false);
        dialog.setContentView(R.layout.dialog_view);
        PDFView pdfView = dialog.findViewById(R.id.pdfView);
        if (pdfPath != null && FileUtils.isFileExists(FileUtils.getFileByPath(pdfPath)))
            pdfView.fromFile(FileUtils.getFileByPath(pdfPath)).defaultPage(0)
                    .enableAnnotationRendering(true)
                    .scrollHandle(new DefaultScrollHandle(this))
                    .load();
        else ToastUtils.showShort("FILE NOT EXISTS");
        dialog.show();
    }

3-对话框XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@android:color/white">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:gravity="center"
            android:text="Post document"
            android:textAllCaps="true"
            android:textColor="@android:color/black"
            android:textSize="24sp"
            android:textStyle="bold" />

        <com.github.barteksc.pdfviewer.PDFView
            android:id="@+id/pdfView"
            android:layout_width="match_parent"
            android:layout_height="400dp" />

        <Button
            android:id="@+id/cancel_action"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="end"
            android:layout_margin="4dp"
            android:background="@null"
            android:text="Cancel" />
    </LinearLayout>
</RelativeLayout>

4-像这样调用Download类:

 final String pdfUrl = "https://www.tutorialspoint.com/computer_programming/computer_programming_tutorial.pdf";
    

 new DownloadFile().execute(pdfUrl,"PDF_NAME_");

结果:

使用的库:

implementation 'com.blankj:utilcodex:1.29.0'
implementation 'com.github.barteksc:android-pdf-viewer:2.8.2'

权限:

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...