[英]How can I Open a PDF document using PDFView inside an AlertDialog?
我正在創建一個應用程序,人們可以在其中共享文檔。 我想以一種方式創建它,當用戶單擊文檔時,它會在應用程序內部打開,而不是使用 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, 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"/>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.