Android4.4通过PrintManger调用系统默认打印服务的默认打印机进行打印任务,并通过反射调用PrintManager的getPrintJob方法获取打印任务状态。不说太多,直接上代码。第一步,调用系统默认打印机打印任务。```在这里插入打印代码PrintManager printManager = (PrintManager) context.getSystemService(Context.PRINT_SERVICE);PrintAttributes attributes = new PrintAttributes.Builder().setMediaSize(PrintAttributes.MediaSize.ISO_A4).setColorMode(PrintAttributes.COLOR_MODE_COLOR).setMinMargins(PrintAttributes.Margins.NO_MARGINS).build();MyPrintAdapter myPrintAdapter = new MyPrintAdapter(bitmap, null);PrintJob printJob = printManager.print("print job " + System.currentTimeMillis(), myPrintAdapter, attributes);```MyPrintAdapter .java```在这里插入代码片public class MyPrintAdapter extends PrintDocumentAdapter {private final Bitmap mBitmap;private final Runnable mCallback;private PdfDocument mPdfDocument;private int mPageWidth = 101 * 65 / 25;private int mPageHeight = 140 * 65 / 25;private BitmapProcessor processor;//TODO 亮度+80,对比度-20public MyPrintAdapter(Bitmap bitmap, Runnable runnable) {this.mBitmap = bitmap;this.mCallback = runnable;);}@Overridepublic void onLayout(PrintAttributes oldAttributes, PrintAttributes newAttributes, CancellationSignal cancellationSignal,LayoutResultCallback callback,Bundle metadata) {final Context context = Library.getContext();mPdfDocument = new PrintedPdfDocument(context, newAttributes); //创建可打印PDF文档对象if (cancellationSignal.isCanceled()) {callback.onLayoutCancelled();return;}PrintDocumentInfo.Builder builder = new PrintDocumentInfo.Builder("print.pdf").setContentType(PrintDocumentInfo.CONTENT_TYPE_PHOTO).setPageCount(1);  //构建文档配置信息final PrintDocumentInfo info = builder.build();callback.onLayoutFinished(info, true);}@Overridepublic void onWrite(final PageRange[] pageRanges, final ParcelFileDescriptor destination, final CancellationSignal cancellationSignal,final WriteResultCallback callback) {final PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(mPageWidth,//= (int) (PrintAttributes.MediaSize.NA_INDEX_4X6.getWidthMils() / 1000 * 72 *(135/145.0)),mPageHeight,//= (int) (PrintAttributes.MediaSize.NA_INDEX_4X6.getHeightMils() / 1000 * 72*(135/145.0)),1).create();PdfDocument.Page page = mPdfDocument.startPage(pageInfo);  //创建新页面if (cancellationSignal.isCanceled()) {  //取消信号callback.onWriteCancelled();mPdfDocument.close();mPdfDocument = null;return;}drawPage(page);  //将内容绘制到页面Canvas上mPdfDocument.finishPage(page);try {mPdfDocument.writeTo(new FileOutputStream(destination.getFileDescriptor()));} catch (IOException e) {callback.onWriteFailed(e.toString());return;} finally {mPdfDocument.close();mPdfDocument = null;}callback.onWriteFinished(pageRanges);}public void setBitmapProcessor(BitmapProcessor processor) {if (processor != null)this.processor = processor;}//页面绘制(渲染)private void drawPage(PdfDocument.Page page) {final Canvas canvas = page.getCanvas();final Bitmap temp = processor.size(mPageWidth, mPageHeight).apply(mBitmap);final Matrix matrix = new Matrix();final Paint paint = new Paint();paint.setAntiAlias(true);if (temp != null && !temp.isRecycled())canvas.drawBitmap(temp, matrix, paint);elseLogger.error("bitmap is recycled");try {if (temp != null && !temp.isRecycled()) {temp.recycle();}} catch (Exception e) {}}@Overridepublic void onFinish() {if (mCallback != null)new Thread() {@Overridepublic void run() {try {mCallback.run();} catch (Exception e) {Logger.debug(e);}}}.start();super.onFinish();}}```在这里,调用打印任务的方法大概就是这样。第二步,获取打印任务状态使用调用任务返回的PrintJob参数,通过调用PrintManager类的getPrintJob方法获取打印状态。我们查看PrintManager的源代码可以看到PrintManager.java里面的getPrintJob方法是hide的,需要的参数类型是PrintJobId,返回值为PrintJob```在这里插入代码片/*** Gets a print job given its id.* * @return The print job list.* @see PrintJob* @hide*/public PrintJob getPrintJob(PrintJobId printJobId) {try {PrintJobInfo printJob = mService.getPrintJobInfo(printJobId, mAppId, mUserId);if (printJob != null) {return new PrintJob(printJob, this);}} catch (RemoteException re) {Log.e(LOG_TAG, "Error getting print job", re);}return null;}```接下来我们通过反射取调用这个方法。```try {Class<?> c = PrintManager.class;Method getPrintJob = c.getDeclaredMethod("getPrintJob", PrintJobId.class);if (getPrintJob != null) {getPrintJob.setAccessible(true);//这里使用的printJobId为开始打印任务是的返回值   PrintJob.getId()PrintJob printJobState = (PrintJob) (getPrintJob.invoke(printManager, printJobId)); Log.e("Printer", "printJob--" + printJobState.getInfo().toString());if (printJobState.isCompleted()) {Log.e("Printer", "printJob--complete");} else if (printJobState.isFailed()) {Log.e("Printer", "printJob--printFail");}else if(printJobState.isCancelled()){Log.e("Printer", "printJob--cancel");}else if(!printJobState.isStarted()){waitCount++;if (waitCount>30){isComplete = true;onPrintListener.printFail();printJobState.cancel();Log.e("Printer", "printJob--not statrt");}}}Thread.sleep(2000);} catch (Exception e) {e.printStackTrace();}```这样就可以根据项目的实际情况来处理打印任务状态了。这样就实现了调用系统打印服务了,但是这种方法有一个缺点,就是它实际上调用了系统默认的一个打印页面,需要人为的选择打印机去确认打印,这种方式有些场景可能不太合适,下一篇文章我将介绍如何自定义一个打印服务去实现后台打印(注意,这种情况是需要选择固定名称的打印机)。

Android调用系统默认打印机并反射获取打印任务状态相关推荐

  1. C#调用系统默认打印机打印文字和图片

    本方法适用于有打印驱动的打印机打印.直接用电脑默认打印机进行打印文字和图片. 首先安装打印机驱动,然后在设备和打印机中将要用的打印机设为默认打印机,然后调用该方法即可 Pulic Void Print ...

  2. java原生打印实现自动调用系统默认打印机

    最近公司项目里要实现一个自动打印的功能,还不让引入网上造好的轮子,所以只能去研究Java自带的打印,网上好多的文章写得都不是很详细,找了很久才找到能够完美实现功能的方法,记录一下 首先是一个继承了Pr ...

  3. 打印技术之获取及设置系统默认打印机

    http://www.cnblogs.com/menlsh/p/4189126.html 本文主要介绍如何获取以及设置系统的默认打印机. 1.获取系统中的所有打印机 获取系统中的所有打印机可以使用En ...

  4. 【打印技术01】获取及设置系统默认打印机

    本文主要介绍如何获取以及设置系统的默认打印机. 1.获取系统中的所有打印机 获取系统中的所有打印机可以使用EnumPrinters()函数,该函数可以枚举全部的本地.网络打印机信息.其函数原型为: 1 ...

  5. 【VC++技术杂谈002】打印技术之获取及设置系统默认打印机

    本文主要介绍如何获取以及设置系统的默认打印机. 1.获取系统中的所有打印机 获取系统中的所有打印机可以使用EnumPrinters()函数,该函数可以枚举全部的本地.网络打印机信息.其函数原型为: 1 ...

  6. android 调用系统相机拍照 获取原图

    博客源址:android 调用系统相机拍照 获取原图 博客时间:2013-04-23 11:08 好吧,为了这个问题又折腾了一整天.之前在网上找来的方法,如果在onActivityResult中直接用 ...

  7. android安装自动打开网页,Android调用系统自带浏览器打开网页的实现方法

    Android调用系统自带浏览器打开网页的实现方法 在Android中可以调用自带的浏览器,或者指定一个浏览器来打开一个链接.只需要传入一个uri,可以是链接地址. 启动android默认浏览器 在A ...

  8. android 图库管理,Android调用系统图库

    上面一篇讲到Android调用系统相机时遇到的兼容性问题,没想到选择系统图库的时候竟然也遇到了系统兼容性问题,在这里记录下解决方案吧. 首先是调用系统默认图库代码: Intent intent = n ...

  9. android 调用 系统 相机 摄像机 拍照 拍视频

    主要内容如下: 系统现有相机应用的调用 系统现有相机拍摄照片 获取系统现有相机拍摄的图片 系统现有相机拍摄图片Demo 系统现有相机拍摄视频 系统现有相机拍摄视频Demo 系统现有相机应用的调用 对于 ...

最新文章

  1. HTML5游戏开发(四):飞机大战之显示场景和元素
  2. linux fedora14 u盘运行,Win7下Fedora 14 硬盘或U盘安装指南
  3. 详解 lsusb命令
  4. 帕金森定律(Parkinson's Law)
  5. 生产消费是什么设计模式_快速消费品的完整形式是什么?
  6. bob-tong 字符串函数之Strtok()函数
  7. win10需要开启系统打印机服务器,Win10系统开启和关闭打印机服务技巧
  8. matlab求滤波器的相频特性,matlab仿真一阶低通滤波器幅频特性和相频特性.docx
  9. 51单片机:74LS138译码实验
  10. java pdf转jpg清晰度_java 库 pdfbox 将 pdf 文件转换成高清图片方法
  11. 络腮胡子的男程序员们都在怎么刮胡子呢?应该用电推子来刮胡子
  12. Java读写Excel原来这么简单
  13. 抓包 把笔记本改造成无线路由器 —— 手机抓包牛刀小试
  14. 1_Qt的介绍和开始
  15. [uboot] (第五章)uboot流程——uboot启动流程
  16. Android实现网络下载二(多任务下载--支持断点续传)
  17. 坯子库怎么导入插件_SketchUp坯子库管理器 坯子插件库免费版v2019.4.0 - 云骑士一键重装系统...
  18. docker之操作管理应用模板、镜像、容器、构建基础镜像、状态删除
  19. 制造业物联网的商业案例
  20. 服务器搭建本地局域网下载文件(sz下载大文件总是出问题)

热门文章

  1. win10休眠设置_原来win10这样设置,电脑就能释放30G,比win7运行还顺畅
  2. jpg转word可以在线转换吗?上班族都想知道
  3. S32K148_ProcessorExpert之定时器中断
  4. 钉钉小程序bug日记
  5. 自适应光学望远镜技术
  6. selenium模拟登陆淘宝
  7. bp神经网络的应用场景,bp神经网络的应用领域
  8. 区块链金融理论测试【图片版】「区块链知识」
  9. [爬虫]beatifusoup简单教程
  10. SpringBoot+Vue项目大学生体质测试管理系统