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, 0, 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 - 像这样调用下载类:
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"/>