編寫:jdneo - 原文:http://developer.android.com/training/printing/html-docs.html
如果要在Android上打印比一副照片更豐富的內容,我們需要將文本和圖片組合在一個待打印的文檔中。Android框架提供了一種使用HTML語言來構建文檔并進行打印的方法,它使用的代碼數量是很小的。
WebView類在Android 4.4(API Level 19)中得到了更新,使得它可以打印HTML內容。該類允許我們加載一個本地HTML資源或者從網頁下載一個頁面,創(chuàng)建一個打印任務,并把它交給Android打印服務。
這節(jié)課將展示如何快速地構建一個包含有文本和圖片的HTML文檔,以及如何使用WebView打印該文檔。
用WebView打印一個HTML文檔,會涉及到加載一個HTML資源,或者用一個字符串構建HTML文檔。這一節(jié)將描述如何構建一個HTML的字符串并將它加載到WebView中,以備打印。
該View對象一般被用來作為一個Activity布局的一部分。然而,如果應用當前并沒有使用WebView,我們可以創(chuàng)建一個該類的實例,以進行打印。創(chuàng)建該自定義View的主要步驟是:
下面的代碼展示了如何創(chuàng)建一個簡單的WebViewClient并且加載一個動態(tài)創(chuàng)建的HTML文檔:
private WebView mWebView;
private void doWebViewPrint() {
// Create a WebView object specifically for printing
WebView webView = new WebView(getActivity());
webView.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
@Override
public void onPageFinished(WebView view, String url) {
Log.i(TAG, "page finished loading " + url);
createWebPrintJob(view);
mWebView = null;
}
});
// Generate an HTML document on the fly:
String htmlDocument = "<html><body><h1>Test Content</h1><p>Testing, " +
"testing, testing...</p></body></html>";
webView.loadDataWithBaseURL(null, htmlDocument, "text/HTML", "UTF-8", null);
// Keep a reference to WebView object until you pass the PrintDocumentAdapter
// to the PrintManager
mWebView = webView;
}
Note: 請確保在[WebViewClient](http://developer.android.com/reference/android/webkit/WebViewClient.html#onPageFinished(android.webkit.WebView, java.lang.String))中的onPageFinished()方法內調用創(chuàng)建打印任務的方法。如果沒有等到頁面加載完畢就進行打印,打印的輸出可能會不完整或空白,甚至可能會失敗。
Note:在上面的樣例代碼中,保留了一個WebView對象實例的引用,這樣能夠確保它不會在打印任務創(chuàng)建之前就被垃圾回收器所回收。在編寫代碼時請務必這樣做,否則打印的進程可能會無法繼續(xù)執(zhí)行。
如果我們希望頁面中包含圖像,將這個圖像文件放置在你的工程的“assets/”目錄中,并指定一個基URL(Base URL),并將它作為loadDataWithBaseURL()方法的第一個參數,就像下面所顯示的一樣:
webView.loadDataWithBaseURL("file:///android_asset/images/", htmlBody,
"text/HTML", "UTF-8", null);
我們也可以加載一個需要打印的網頁,具體做法是將loadDataWithBaseURL()方法替換為loadUrl(),如下所示:
// Print an existing web page (remember to request INTERNET permission!):
webView.loadUrl("http://developer.android.com/about/index.html");
當使用WebView創(chuàng)建打印文檔時,你要注意下面的一些限制:
如果希望創(chuàng)建一個更加自定義化的打印輸出并希望可以完全控制打印頁面上繪制的內容,可以學習下一節(jié)課程:打印自定義文檔
在創(chuàng)建了WebView并加載了我們的HTML內容之后,應用就已經幾乎完成了屬于它的任務。接下來,我們需要訪問PrintManager,創(chuàng)建一個打印適配器,并在最后創(chuàng)建一個打印任務。下面的代碼展示了如何執(zhí)行這些步驟:
private void createWebPrintJob(WebView webView) {
// Get a PrintManager instance
PrintManager printManager = (PrintManager) getActivity()
.getSystemService(Context.PRINT_SERVICE);
// Get a print adapter instance
PrintDocumentAdapter printAdapter = webView.createPrintDocumentAdapter();
// Create a print job with name and adapter instance
String jobName = getString(R.string.app_name) + " Document";
PrintJob printJob = printManager.print(jobName, printAdapter,
new PrintAttributes.Builder().build());
// Save the job object for later status checking
mPrintJobs.add(printJob);
}
這個例子保存了一個PrintJob對象的實例,以供我們的應用將來使用,當然這是不必須的。我們的應用可以使用這個對象來跟蹤打印任務執(zhí)行時的進度。如果希望監(jiān)控應用中的打印任務是否完成,是否失敗或者是否被用戶取消,這個方法非常有用。另外,我們不需要創(chuàng)建一個應用內置的通知,因為打印框架會自動的創(chuàng)建一個該打印任務的系統通知。