最近做了一个政策性文件展示的功能,是webview配合H5页面实现的,在h5的最内层有一个pdf文件的链接,想要在线展示它。然后我就去百度啊(不爱翻墙),很多都是下载后存放在data或assets文件夹下查看,神烦,最烦的就是他们推荐的第一种方式,妈蛋,谷歌都退出大陆了,不翻墙那种方式就不能用,那你们都说个鸡毛啊。下面说正事。
因为公司大牛主推android原生的,所以使用的大部分都是原生或接近原生的库包。在这里我是用的是pdfview,其实我现在的这种处理方式也是下载了,只是没下载到本地。
最近刚发现这个问题,由于pdfview里面的东西太多了,所以会导致你的apk变大10几M,当然这个不是最恶心的,最恶心的是里面的so文件,这会导致一些手机CPU不支持,出现app闪退反复重启的问题。
不太好的解决方法:ndk {
abiFilters"armeabi","armeabi-v7a","x86","x86_64"
}这个方法的弊端在于如果某个函数在各个包有区别,那就真的玩蛋了
导包 implementation'com.github.barteksc:android-pdf-viewer:2.7.0'(as3.0以下的用compile),直接整核心代码了
(1)发现url以.pdf结尾,跳向一个新的Activity
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_riverstrategy);
backBt=findViewById(R.id.btn_back);
//
mWebView=findViewById(R.id.web_view);
mProgressBar=findViewById(R.id.progress_bar);
backBt.setOnClickListener(newView.OnClickListener() {
@Override
public voidonClick(View view) {
if(mWebView.canGoBack()) {
mWebView.goBack();
}else{
finishActivity();
}
}
});
mWebView.loadUrl(BuildConfig.RIVER_STRATEGY_URL);
initWebView();
}
@SuppressLint("SetJavaScriptEnabled")
private voidinitWebView() {
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.setWebViewClient(newWebViewClient() {
@Override
public booleanshouldOverrideUrlLoading(WebView view,String url) {
if(url.endsWith(".pdf")&& url.contains("?url=")){
Intent intent=newIntent(RiverStrategyActivity.this,PdfActivity.class);
intent.putExtra("pdfurl",url);
startActivity(intent);
}else{
view.loadUrl(url);
}
return true;
}
});
(2)在新的activity里面添加pdfview布局
android:id="@+id/pdfview"
android:layout_width="match_parent"
android:layout_height="match_parent">
pdfview支持多种方式查看pdf文件,常用的方法有fromAssets(),fromFile(),fromStream()等,我们这里使用的是fromBytes(),以下是代码,不规范,请见谅
这里我们使用了handler进行线程间传递消息,事后感觉用不用都行。
我们开启一个工作线程用于获取bytes流,这个就是个简单的下载,只是没进行到最后一步,获取到后将bytes流发送到主线程。然后在pdfview使用展示,fromBytes()下面的是pdfview一些对pdf阅览的优化方法,有兴趣的可以了解一下。
public classPdfActivityextendsActivity {
privatePDFViewpdfView;
privateStringurlPdf;
private byte[]bytes=null;
privateHandlermHandler=newHandler(){
@Override
public voidhandleMessage(Message msg) {
super.handleMessage(msg);
switch(msg.what){
case1:
bytes= (byte[]) msg.obj;
pdfView.fromBytes(bytes)
.enableSwipe(true)
.swipeHorizontal(false)
.enableDoubletap(true)
.defaultPage(0)
.onDraw(newOnDrawListener() {
@Override
public voidonLayerDrawn(Canvas canvas, floatpageWidth, floatpageHeight, intdisplayedPage) {
}
})
.onLoad(newOnLoadCompleteListener() {
@Override
public voidloadComplete(intnbPages) {
// Toast.makeText(getApplicationContext(), "loadComplete", Toast.LENGTH_SHORT).show();
}
})
.onPageChange(newOnPageChangeListener() {
@Override
public voidonPageChanged(intpage, intpageCount) {
}
})
.onPageScroll(newOnPageScrollListener() {
@Override
public voidonPageScrolled(intpage, floatpositionOffset) {
}
})
.onError(newOnErrorListener() {
@Override
public voidonError(Throwable t) {
//Toast.makeText(getApplicationContext(), "error", Toast.LENGTH_SHORT).show();
}
})
.enableAnnotationRendering(false)
.password(null)
.scrollHandle(null)
.load();
break;
}
}
};
@Override
protected voidonCreate(@NullableBundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pdf);
pdfView= findViewById(R.id.pdfview);
Intent intent = getIntent();
String url = intent.getStringExtra("pdfurl");
Log.e("----",url);
urlPdf=url.split("=")[1];
newworkThread().start();
}
/**
获取pdf的bytes输出流
**/
private classworkThreadextendsThread {
@Override
public voidrun() {
super.run();
HttpURLConnection connection=null;
InputStream inputStream=null;
try{
URL url =newURL(urlPdf);
connection = (HttpURLConnection)
url.openConnection();
connection.setRequestMethod("GET");//试过POST可能报错
connection.setDoInput(true);
connection.setConnectTimeout(10000);
connection.setReadTimeout(10000);
//实现连接
connection.connect();
Log.e("----","connection.getResponseCode()="+ connection.getResponseCode());
if(connection.getResponseCode() ==200) {
inputStream = connection.getInputStream();
ByteArrayOutputStream outputStream=newByteArrayOutputStream();
byte[] bytes=new byte[1024];
intlen=0;
while((len=inputStream.read(bytes))!=-1){
outputStream.write(bytes,0,len);
}
Log.e("---",outputStream.toString() );
//这里给过去就行了
Message message=Message.obtain();
message.what=1;
message.obj=outputStream.toByteArray();
mHandler.sendMessage(message);
}
}catch(MalformedURLException e) {
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}finally{
try{
if(inputStream!=null){
inputStream.close();
}
if(connection!=null){
connection.disconnect();
}
}catch(IOException e){
e.printStackTrace();
}
}
}
}
}