问题描述
我正在创建一个应用程序,人们可以在其中共享文档。我想以一种方式创建它,即当用户单击文档时,它会在应用程序内打开,而不是使用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"/>