Android实现系统打印功能

发布时间:2019-08-08 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了Android实现系统打印功能脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

本文实例为大家分享了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); }

可以在应用的菜单栏中调用该方法,当pr@L_360_1@Bitmap()方法调用时,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教程
脚本网站
android studio

脚本宝典总结

以上是脚本宝典为你收集整理的Android实现系统打印功能全部内容,希望文章能够帮你解决Android实现系统打印功能所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。