您好,登錄后才能下訂單哦!
這篇文章給大家介紹Android應(yīng)用中怎么對本地pdf文件進(jìn)行加載,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
大部分app打開pdf文件是通過intent調(diào)起手機(jī)中能打開pdf文件的工具,來查看pdf文件,如果需求是,用戶在app內(nèi)下載好pdf文件后,不通過第三方的工具,本地打開。
使用起來也很簡單,首先添加PDFView的引用
compile 'com.github.barteksc:android-pdf-viewer:2.4.0'
布局中引用PdfView
<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.github.barteksc.pdfviewer.PDFView android:id="@+id/pdf_view" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
接下來就是下載pdf文件,為了節(jié)省用戶資源,在每次下載之前檢查一下本地是否有該pdf文件,如果有直接打開,沒有的話再去下載。
這里我寫了一個(gè)加載中的對話框,打開過程中和下載過程中用的都是這一個(gè)
if (CheckFileExist(title)){ builderShow = new CustomDialog(ShowPDFActivity.this); LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.dialog_pdf_progress_new, null); builderShow.setContentView(view); builderShow.show(); isDownload=false; refushUI(); }else { isDownload=true; DownLoadPDF.getInstance().downLoadPDF(ShowPDFActivity.this, //下載路徑); }
如果本地有pdf文件,則開始加載pdf文件,refushUI();
public void refushUI(){ try { pdfView.fromFile(new File(//pdf文件的絕對路徑,//標(biāo)題)) .defaultPage(1) .enableAnnotationRendering(false) .onLoad(new OnLoadCompleteListener() { @Override public void loadComplete(int nbPages) { if (isDownload){ DownLoadPDF.getInstance().closeDilaoig(); } if (builderShow != null&&builderShow.isShowing()) { builderShow.dismiss(); } } }) .scrollHandle(null) .load(); }catch (Exception e){ e.printStackTrace(); } }
PDFView加載pdf文件有兩種形式,一種是從文件中讀取,還有一種就是從assets目錄中讀取
private void displayFromAssets(String assetFileName ) { pdfView.fromAsset(assetFileName) //設(shè)置pdf文件地址 .defaultPage(6) //設(shè)置默認(rèn)顯示第1頁 .onPageChange(this) //設(shè)置翻頁監(jiān)聽 .onLoad(this) //設(shè)置加載監(jiān)聽 .onDraw(this) //繪圖監(jiān)聽 .showMinimap(false) //pdf放大的時(shí)候,是否在屏幕的右上角生成小地圖 .swipeVertical( false ) //pdf文檔翻頁是否是垂直翻頁,默認(rèn)是左右滑動翻頁 .enableSwipe(true) //是否允許翻頁,默認(rèn)是允許翻頁 // .pages( 2 , 3 , 4 , 5 ) //把2 , 3 , 4 , 5 過濾掉 .load(); } private void displayFromFile( File file ) { pdfView.fromFile(file) //設(shè)置pdf文件地址 .defaultPage(6) //設(shè)置默認(rèn)顯示第1頁 .onPageChange(this) //設(shè)置翻頁監(jiān)聽 .onLoad(this) //設(shè)置加載監(jiān)聽 .onDraw(this) //繪圖監(jiān)聽 .showMinimap(false) //pdf放大的時(shí)候,是否在屏幕的右上角生成小地圖 .swipeVertical( false ) //pdf文檔翻頁是否是垂直翻頁,默認(rèn)是左右滑動翻頁 .enableSwipe(true) //是否允許翻頁,默認(rèn)是允許翻 // .pages( 2 , 3 , 4 , 5 ) //把2 , 3 , 4 , 5 過濾掉 .load(); }
本地沒有pdf文件,需要從服務(wù)端獲取,
DownLoadPDF.getInstance().downLoadPDF(ShowPDFActivity.this, //下載路徑);
public class DownLoadPDF { private static Context context; private static File file ; private static CustomDialog builder = null ; private static Handler ddhandle; private static DownLoadPDF instance = null; public static DownLoadPDF getInstance(){ if(instance==null){ synchronized (DownLoadPDF.class){ if(instance==null){ instance = new DownLoadPDF(); } } } return instance; } public void downLoadPDF(final Context con, final String url, final String title, final Handler ddhandler) { ddhandle = ddhandler; context = con; builder = new CustomDialog(con); LayoutInflater inflater = (LayoutInflater) con.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.dialog_pdf_progress_new, null); builder.setContentView(view); builder.show(); new Thread() { @Override public void run() { try { file = getFileFromServer(url,title); sleep(200); if (file != null) { handler.sendEmptyMessage(2); } } catch (Exception e) { e.printStackTrace(); builder.dismiss(); handler.sendEmptyMessage(-1); } } }.start(); } public void closeDilaoig(){ if (builder != null&&builder.isShowing()) { builder.dismiss(); } }public static int length ; public static File getFileFromServer(String path,String title) throws Exception { // 如果相等的話表示當(dāng)前的sdcard掛載在手機(jī)上并且是可用的 if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(5000); conn.setDoInput(true); conn.connect(); length = conn.getContentLength(); InputStream is = conn.getInputStream(); //將pdf文件存儲在指定文件夾下 File filePath = new File(//指定文件夾路徑); if (!filePath.exists()){ filePath.mkdir(); } File file = new File(filePath , title+".pdf"); FileOutputStream fos = new FileOutputStream(file); BufferedInputStream bis = new BufferedInputStream(is); byte[] buffer = new byte[1024]; int len; while ((len = bis.read(buffer)) != -1) { fos.write(buffer, 0, len); handler.sendEmptyMessage(0); } fos.close(); bis.close(); is.close(); return file; } else { handler.sendEmptyMessage(-1); return null; } } private static Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 0: break; case -1: //下載失敗 Toast.makeText(context, "下載失敗,請稍后再試!", Toast.LENGTH_SHORT).show(); break; case 2: ddhandle.sendEmptyMessage(100); break; default: break; } } }; }
大家可以看到,在pdf問價(jià)下載成功的時(shí)候handler.sendEmptyMessage(2);,當(dāng)case為2的時(shí)候,通過調(diào)用該工具類的頁面?zhèn)鬟^來的ddhandle重新發(fā)送了一個(gè)消息,
調(diào)用界面收到消息后會重新調(diào)用refushUI();這個(gè)方法來打開pdf文件。
關(guān)于Android應(yīng)用中怎么對本地pdf文件進(jìn)行加載就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。