引言: 今天公司项目要求用webview加载pdf文件,但从我掌握的知识中来说,我认为webview是不能实现pdf在线阅读这样功能的。那么怎么去符合我们项目的要求呢,既然不能在线阅读,那么我先把文件下载了,然后再用可读pdf文件的PDFView控件来显示不就行了吗!下面就是我的实现方式
一:准备工作
我用的Android studio工具,那么用PDFView就很简单了,在我们的build.gradle文件中
dependncies{
compile 'com.joanzapata.pdfview:android-pdfview:1.0.4@aar'
}
二:自定义webview,方便自己的一些效果实现
package com.dingwei.excavator.activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.dingwei.excavator.R;
import com.dingwei.excavator.utils.DownPdfFileTask;
import com.pino.ztllibrary.BaseActivity;
import com.pino.ztllibrary.app.AppManager;
import com.pino.ztllibrary.app.upgrade.UpdateUtil;
import com.pino.ztllibrary.util.PreferenceUtils;
import com.pino.ztllibrary.util.ToastUtils;
import com.pino.ztllibrary.widget.ProgressWebView;
import org.xutils.view.annotation.Event;
import org.xutils.view.annotation.ViewInject;
import org.xutils.x;
/**
* Created by Administrator on 2016/6/24.
* webviewactivity
*/
public class WebviewActivity extends BaseActivity {
@ViewInject(R.id.commontitle)
private TextView titles;
@ViewInject(R.id.commonright)
private TextView right;
@ViewInject(R.id.commonback)
private LinearLayout back;
@ViewInject(R.id.webview)
private ProgressWebView webView;
String pdf_path = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_webview);
x.view().inject(this);
AppManager.getAppManager().addActivity(this);
pdf_path = PreferenceUtils.getValue(this,"pdf_down_path","none");
initView();
}
private void initView() {
webView.setProgressWebView(android.R.attr.progressBarStyleHorizontal);
webView.setOnProgressTypeLinterner(new ProgressWebView.OnProgressTypeLinterner() {
@Override
public void startType(WebView view, ProgressBar progressbar) {
}
@Override
public void endType(WebView view, ProgressBar progressbar) {
}
});
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webView.setOnTitleChange(new ProgressWebView.OnTitleChange() {
@Override
public void updateTitle(String title) {
if (TextUtils.isEmpty(title)){
titles.setText("");
}else{
titles.setText(title);
}
}
});
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//该方法就是用来拦截webview中的标签等的跳转,注意:返回true就是自定义处理,返回false就是不拦截
if (!pdf_path.equals(url)){
final String path = url;
UpdateUtil.showAlertDialogChoose(WebviewActivity.this, "版本更新",
"下载该PDF文件", "暂不下载", "立即下载", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
switch (i) {
case UpdateUtil.BUTTON1:
dialogInterface.dismiss();
break;
case UpdateUtil.BUTTON2:
dialogInterface.dismiss();
if (TextUtils.isEmpty(path)) {
ToastUtils.show(WebviewActivity.this,"为发现下载地址");
} else {
downPdfFile(WebviewActivity.this,path);
}
break;
}
}
});
//存储url 防止重复下载问题
PreferenceUtils.setValue(WebviewActivity.this,"pdf_down_path",url);
}else{
Intent i = new Intent(WebviewActivity.this, PDFReaderActivity.class);
i.putExtra("path",PreferenceUtils.getValue(WebviewActivity.this,"pdf_file_path","none"));
startActivity(i);
}
return true;
}
});
//webview加载
webView.loadUrl(this.getIntent().getStringExtra("url"));
}
//下载pdf文件
private void downPdfFile(WebviewActivity webviewActivity, String path) {
DownPdfFileTask task = new DownPdfFileTask(webviewActivity,"/excavator/pdf");
task.execute(path);
}
@Event(value = {R.id.commonback})
private void onClick(View v){
switch (v.getId()){
case R.id.commonback:
AppManager.getAppManager().finishActivity(this);
translateAnimationOut();
break;
}
}
}
package com.dingwei.excavator.utils;
import android.app.AlertDialog;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.dingwei.excavator.activity.PDFReaderActivity;
import com.pino.ztllibrary.R;
import com.pino.ztllibrary.util.DoubleUtil;
import com.pino.ztllibrary.util.FileUtils;
import com.pino.ztllibrary.util.PreferenceUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
/**
下载文件
*/
public class DownPdfFileTask extends AsyncTask<String, Integer, String> {
private Context mContext;
private DownTaskCancelListner cancleListener = null;
private long length;
private boolean running = false;
private ProgressBar progreassBar;
private int mb = 1024 * 1024;
private TextView showDownload;
private AlertDialog dlg;
private String mPath;
private TextView mtitle;
public interface DownTaskCancelListner {
public void downTaskCancelNotify();
}
public void setCancleListener(DownTaskCancelListner cancleListener) {
this.cancleListener = cancleListener;
}
public DownPdfFileTask(Context context, String path) {
this.mContext = context;
this.mPath = path;
dlg = new AlertDialog.Builder(context).create();
dlg.setCancelable(false);
dlg.show();
Window window = dlg.getWindow();
window.setContentView(R.layout.update_version_dialog);
progreassBar = (ProgressBar) window.findViewById(R.id.progreassBar);
showDownload = (TextView) window.findViewById(R.id.progress_text);
mtitle = (TextView) window.findViewById(R.id.dialog_top);
Button cancel = (Button) window
.findViewById(R.id.alert_dialog_confirm_btn);
mtitle.setText("正在下载...");
cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onCancelled();
dlg.dismiss();
if (cancleListener != null) {
cancleListener.downTaskCancelNotify();
}
}
});
}
@Override
protected String doInBackground(String... params) {
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(params[0]);
HttpResponse response = null;
FileOutputStream fileOutputStream = null;
InputStream is = null;
File file = null;
String result = null;
try {
String fileName = "";
fileName = FileUtils.getPath(mContext, params[0], mPath);
response = client.execute(get);
if (response.getStatusLine().getStatusCode() != 200)
throw new IOException("StatusCode!=200");
HttpEntity entity = response.getEntity();
length = entity.getContentLength();
progreassBar.setMax((int) length);
is = entity.getContent();
if (is != null) {
file = new File(fileName);
file.createNewFile();
fileOutputStream = new FileOutputStream(file);
byte[] buf = new byte[1024];
int ch = -1;
int count = 0;
while (running && (ch = is.read(buf)) != -1) {
fileOutputStream.write(buf, 0, ch);
count += ch;
if (length > 0) {
// 如果知道响应的长度,调用publishProgress()更新进度
publishProgress(count);
}
}
fileOutputStream.flush();
if (fileOutputStream != null) {
fileOutputStream.close();
}
if (!running) {
if (file.exists()) {
file.delete();
}
return null;
}
File apk = new File(fileName);
file.renameTo(apk);
result = fileName;
}
} catch (ClientProtocolException e) {
if (file != null && file.exists())
file.delete();
} catch (IOException e) {
if (file != null && file.exists())
file.delete();
handler.sendEmptyMessage(0);
} catch (Exception e) {
} finally {
try {
if (is != null)
is.close();
} catch (IOException e1) {
}
}
return result;
}
@Override
protected void onCancelled() {
running = false;
super.onCancelled();
}
@Override
protected void onPreExecute() {
running = true;
dlg.show();
super.onPreExecute();
}
@Override
protected void onPostExecute(String result) {
try {
dlg.dismiss();
} catch (Exception e) {
}
dlg.dismiss();
if (result != null) {
installPrograme(result);
}
}
@Override
protected void onProgressUpdate(Integer... values) {
// 更新进度
progreassBar.setProgress(values[0]);
double a = values[0] * 1.0 / mb;
showDownload.setText("已下载:" + DoubleUtil.getString(a) + "MB/"
+ DoubleUtil.getString((length * 1.00) / mb) + "MB");
}
protected void installPrograme(String fileName) {
//下载完成 自动跳转到 自定义的PDFReader界面
PreferenceUtils.setValue(mContext,"pdf_file_path",fileName);
Intent i = new Intent(mContext, PDFReaderActivity.class);
i.putExtra("path",fileName);
mContext.startActivity(i);
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
Toast.makeText(mContext, "下载失败,请稍后再试", Toast.LENGTH_SHORT)
.show();
break;
}
}
};
}
三:PDFReader界面,加载pdf文件并显示出来
1.activity_pdf_reader.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include layout="@layout/common_title"/>
<com.joanzapata.pdfview.PDFView
android:id="@+id/pdfview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
package com.dingwei.excavator.activity;
import android.os.Bundle;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.dingwei.excavator.R;
import com.joanzapata.pdfview.PDFView;
import com.joanzapata.pdfview.exception.FileNotFoundException;
import com.joanzapata.pdfview.listener.OnPageChangeListener;
import com.pino.ztllibrary.BaseActivity;
import com.pino.ztllibrary.app.AppManager;
import org.xutils.view.annotation.Event;
import org.xutils.view.annotation.ViewInject;
import org.xutils.x;
import java.io.File;
/**
* Created by Administrator on 2016/6/24.
* pdf文件阅读界面的activity
*/
public class PDFReaderActivity extends BaseActivity implements OnPageChangeListener{
@ViewInject(R.id.commontitle)
private TextView title;
@ViewInject(R.id.commonright)
private TextView right;
@ViewInject(R.id.commonback)
private LinearLayout back;
@ViewInject(R.id.pdfview)
private PDFView pdfView;
private File file;
String path= "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pdf_reader);
x.view().inject(this);
AppManager.getAppManager().addActivity(this);
path = this.getIntent().getStringExtra("path");
if (path.equals("none")){
makeToast("文件不存在");
}else{
try {
file = new File(path);
title.setText("PDF在线阅读");
pdfView.fromFile(file)
.defaultPage(1)
.onPageChange(this)
.load();
}catch (FileNotFoundException e){
makeToast("文件不存在!");
}
}
}
@Override
public void onPageChanged(int page, int pageCount) {
}
@Event(value = {R.id.commonback})
private void onClick(View v){
switch (v.getId()){
case R.id.commonback:
AppManager.getAppManager().finishActivity(this);
translateAnimationOut();
break;
}
}
}
注:上面的PrefrencesUtils是本人写的一个工具类,用shareprefrence代替即可!
一切搞定,经本人亲测有效!如有任何疑问请咨询我QQ:844861961
今天的努力是为了明天的美好,加油!