中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android如何實現系統打印功能

發布時間:2021-04-16 11:29:57 來源:億速云 閱讀:285 作者:小新 欄目:移動開發

這篇文章給大家分享的是有關Android如何實現系統打印功能的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

具體內容如下

一、打印圖片

使用PrintHelper類,如:

private void doPhotoPrint() {
 PrintHelper photoPrinter = new PrintHelper(getActivity());
 photoPrinter.setScaleMode(PrintHelper.SCALE_MODE_FIT);
 Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
   R.drawable.droids);
 photoPrinter.printBitmap("droids.jpg - test print", bitmap);
}

可以在應用的菜單欄中調用該方法,當printBitmap()方法調用時,Android系統的打印界面
會彈出,用戶可以設置一些參數,然后進行打印或取消。

二、打印自定義文檔

1.連接到PrintManager類:

private void doPrint() {
 // Get a PrintManager instance
 PrintManager printManager = (PrintManager) getActivity()
   .getSystemService(Context.PRINT_SERVICE);
 
 // Set job name, which will be displayed in the print queue
 String jobName = getActivity().getString(R.string.app_name) + " Document";
 
 // Start a print job, passing in a PrintDocumentAdapter implementation
 // to handle the generation of a print document
 printManager.print(jobName, new MyPrintDocumentAdapter(getActivity()),
   null); //
}

注:print函數第二個參數為繼承了抽象類PrintDocumentAdapter 的適配器類,第三個參數為 PrintAttributes對象,

可以用來設置一些打印時的屬性。

2.創建打印適配器類

打印適配器與Android系統的打印框架進行交互,處理打印的生命周期方法。打印過程主要有以下生命周期方法:

  • onStart():當打印過程開始的時候調用;

  • onLayout():當用戶更改打印設置導致打印結果改變時調用,如更改紙張尺寸,紙張方向等;

  • onWrite():當將要打印的結果寫入到文件中時調用,該方法在每次onLayout()調用后會調用一次或多次;

  • onFinish():當打印過程結束時調用。

注:關鍵方法有onLayout()和onWrite(),這些方法默認都是在主線程中調用,因此如果打印過程比較耗時,應該在后臺線程中進行。

3.覆蓋onLayout()方法

在onLayout()方法中,你的適配器需要告訴系統框架文本類型,總頁數等信息,如:

@Override
public void onLayout(PrintAttributes oldAttributes,
      PrintAttributes newAttributes,
      CancellationSignal cancellationSignal,
      LayoutResultCallback callback,
      Bundle metadata) {
 // Create a new PdfDocument with the requested page attributes
 mPdfDocument = new PrintedPdfDocument(getActivity(), newAttributes);
 
 // Respond to cancellation request
 if (cancellationSignal.isCancelled() ) {
  callback.onLayoutCancelled();
  return;
 }
 
 // Compute the expected number of printed pages
 int pages = computePageCount(newAttributes);
 
 if (pages > 0) {
  // Return print information to print framework
  PrintDocumentInfo info = new PrintDocumentInfo
    .Builder("print_output.pdf")
    .setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT)
    .setPageCount(pages);
    .build();
  // Content layout reflow is complete
  callback.onLayoutFinished(info, true);
 } else {
  // Otherwise report an error to the print framework
  callback.onLayoutFailed("Page count calculation failed.");
 }
}

注:onLayout()方法的執行有完成,取消,和失敗三種結果,你必須通過調用 PrintDocumentAdapter.LayoutResultCallback類的適當回調方法表明執行結果, onLayoutFinished()方法的布爾型參數指示布局內容是否已經改變。

onLayout()方法的主要任務就是計算在新的設置下,需要打印的頁數,如通過打印的方向決定頁數:
private int computePageCount(PrintAttributes printAttributes) {
 int itemsPerPage = 4; // default item count for portrait mode
 
 MediaSize pageSize = printAttributes.getMediaSize();
 if (!pageSize.isPortrait()) {
  // Six items per page in landscape orientation
  itemsPerPage = 6;
 }
 
 // Determine number of print items
 int printItemCount = getPrintItemCount();
 
 return (int) Math.ceil(printItemCount / itemsPerPage);
}

4.覆蓋onWrite()方法

當需要將打印結果輸出到文件中時,系統會調用onWrite()方法,該方法的參數指明要打印的頁以及結果寫入的文件,你的方法實現需要將頁面的內容寫入到一個多頁面的PDF文檔中,當這個過程完成時,需要調用onWriteFinished() 方法,如:

@Override
public void onWrite(final PageRange[] pageRanges,
     final ParcelFileDescriptor destination,
     final CancellationSignal cancellationSignal,
     final WriteResultCallback callback) {
 // Iterate over each page of the document,
 // check if it's in the output range.
 for (int i = 0; i < totalPages; i++) {
  // Check to see if this page is in the output range.
  if (containsPage(pageRanges, i)) {
   // If so, add it to writtenPagesArray. writtenPagesArray.size()
   // is used to compute the next output page index.
   writtenPagesArray.append(writtenPagesArray.size(), i);
   PdfDocument.Page page = mPdfDocument.startPage(i);
 
   // check for cancellation
   if (cancellationSignal.isCancelled()) {
    callback.onWriteCancelled();
    mPdfDocument.close();
    mPdfDocument = null;
    return;
   }
 
   // Draw page content for printing
   drawPage(page);
 
   // Rendering is complete, so page can be finalized.
   mPdfDocument.finishPage(page);
  }
 }
 
 // Write PDF document to file
 try {
  mPdfDocument.writeTo(new FileOutputStream(
    destination.getFileDescriptor()));
 } catch (IOException e) {
  callback.onWriteFailed(e.toString());
  return;
 } finally {
  mPdfDocument.close();
  mPdfDocument = null;
 }
 PageRange[] writtenPages = computeWrittenPages();
 // Signal the print framework the document is complete
 callback.onWriteFinished(writtenPages);
 
 ...
}

drawPage()方法實現:

private void drawPage(PdfDocument.Page page) {
 Canvas canvas = page.getCanvas();
 
 // units are in points (1/72 of an inch)
 int titleBaseLine = 72;
 int leftMargin = 54;
 
 Paint paint = new Paint();
 paint.setColor(Color.BLACK);
 paint.setTextSize(36);
 canvas.drawText("Test Title", leftMargin, titleBaseLine, paint);
 
 paint.setTextSize(11);
 canvas.drawText("Test paragraph", leftMargin, titleBaseLine + 25, paint);
 
 paint.setColor(Color.BLUE);
 canvas.drawRect(100, 100, 172, 172, paint);
}

感謝各位的閱讀!關于“Android如何實現系統打印功能”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

两当县| 林州市| 康定县| 宁陕县| 北碚区| 绥阳县| 鄂温| 迁西县| 浙江省| 四子王旗| 巨鹿县| 休宁县| 广西| 岑溪市| 莆田市| 若尔盖县| 临桂县| 西和县| 扶余县| 砀山县| 铁岭市| 壤塘县| 祁连县| 六安市| 太康县| 云安县| 红河县| 浮山县| 永城市| 交城县| 普陀区| 师宗县| 巧家县| 临夏市| 陇川县| 兰坪| 广水市| 林周县| 辽中县| 平乡县| 会东县|