Android调用打印机

本文详细介绍了如何在Android系统上实现打印机驱动,首先在Linux环境中测试打印机,然后进行CUPS、ghostscript等组件的交叉编译,最后探讨了将最简打印系统移植到Android中所面临的目录结构、设备节点和字体问题的解决方案。
摘要由CSDN通过智能技术生成

        打印机其实和Android没有什么大的关系,和linux内核关联才是比较强的。

       最终的结果是要在Android实现驱动打印机,但是一般调试一个新的驱动的流程是这样的:1.先在linux PC上进行测试。2.在标准嵌入式linux上进行调试。3.改装到Android中去。

       为什么这么安排?因为资源是递减的,可以在第一阶段确定设备有无问题,以及该设备在linux工作流程;在第二阶段是因为标准的嵌入式linux还是遵循GNU规定的,包括大部分,这个阶段验证该设备能否在ARM架构的上顺利编译通过;第三阶段就是实用阶段了,因为最终要在这个不是怎么遵守GNU规定的Android系统上运行的。

 

第一阶段

       我测试了3台打印机:1.Canon iP2780 2.Canon MX428 3.HP Deskjet 1000。由于的我作业系统就是Linux,在Linux PC上很快就逐个搞定。第1台用的是这里的驱动(包括deb包和部分开源源码)加上这个《iP2700 series IJ Printer Driver Ver. 3.30 for Linux (操作说明)》,机器就可以正常使用了;第2台和第一台驱动模式都是一样的只不过在这里;第3台用的是这里的一级一级选择最终下载文件是:hplip-3.14.1.run,直接执行会把所缺失的东西全部安装,可以成功使用。

       如果我仅仅是一个使用者,那么到现在可以就结束了。但是我是一个开发者,我最终的目标是移植到Android中,所以我的目的地不在这里,我要继续深度挖掘。要挖掘的点很多,这里说一个最迫切的就是如何用命令打印一个文件?这个问题似乎很奇怪,但是我也不知道如何做。不过最终找到了就是:lp或者lpr加文件名,就可以打印出一个文件了。例如:

lp ~/hello.pdf

 

       找这么一个命令我就花费了几个小时的时间,这里我就有一种很强的预感,前边的路很还很遥远。(整理文章的顺序和实验的步骤会稍有不同,其实这个命令在《iP2700 series IJ Printer Driver Ver. 3.30 for Linux (操作说明)》是有的,但是这个“操作说明”是后来才看到的)。

       现在看来我不应该草率进行去进行第二个阶段,应该好好的研究一下Linux的打印系统。总结文章就按照最好的流程来吧。先说我是怎么了解了linux的打印系统的。

       意外发现的这个本书《Linux系统管理技术手册》,真是对我了解Linux的打印系统帮助是最大的,涵盖的知识面也是最全的,以后的阶段中用到的自认为是新的东西,其实这本书上都详细讲解了。讲解打印不是讲解如何打印就好了,而是详细的讲解了打印机的原理,要经过哪些步骤,打印机语言等等,如果是国人写的书一般会说“此内容不在本书要讨论的范围内”一句概括。那一章我反复看了一周时间才算有些眉目。

       一切终归一张图:

       其实到目前为止我应该好好规划一下我要设计的东西,实现中我急功近利了,并没有做完全的规划就进行了第二阶段。

小规划:

       打印机选择:推荐选择HP的,激光的喷墨的都可以,HP是全力支持Linux的。

       打印系统的选择:

              大的架构是CUPS,主要的模块有:

                     后台:

                     过滤器:

                     PPD:

       其实在图中随便从上到下连一条线,就可以组合成一套打印系统。下面进入第二阶段吧。 

       在测试过程中还意外发现CUPS一个bug,或者是我还没有已经有解决方案我还没有发现而已。那就是CUPS缺少错误处理, 一台打印机,如果出现墨盒用完,墨盒实效等等问题的时候,CUPS是没有告知用户的。比如我的HP Deskjet 1000,在使用CUPS打印时出现了这个情况:打印机无响应,用lpstat -t查看到的状态是“Rendering completed”。这就找不到问题所在了,不过同样的情况下在Windows下找到了答案:

 

第二阶段

       调试Canon的打印机的时候我选择了这样的架构:CUPS+cnijfilter-source-3.30-1.tar.gz.

1.配置Linux内核(作用:生成设备节点)

make menuconfig 选上USB打印机选项:
       Device Drivers  --->
                     

要在Android应用程序中调用打印机打印图片,可以使用Android自带的打印API。以下是一些可能的步骤: 1. 确定您要使用的打印机类型,并使用相应的打印机驱动程序将其连接到Android设备。 2. 在Android应用程序中,使用Bitmap对象来加载要打印的图像。 3. 创建PrintDocumentAdapter对象,该对象将负责管理打印过程。 4. 实现PrintDocumentAdapter的onWrite()方法,该方法将图像写入打印输出流。 5. 创建PrintManager对象,并使用它来启动打印作业。 以下是一个简单的代码示例,用于在Android应用程序中调用打印机打印图片: ```java private void printImage(Bitmap bitmap) { // Create a PrintManager instance PrintManager printManager = (PrintManager) getSystemService(Context.PRINT_SERVICE); // Set the print job name String jobName = getString(R.string.app_name) + " Document"; // Start a print job printManager.print(jobName, new MyPrintDocumentAdapter(bitmap), null); } private class MyPrintDocumentAdapter extends PrintDocumentAdapter { private Bitmap bitmap; public MyPrintDocumentAdapter(Bitmap bitmap) { this.bitmap = bitmap; } @Override public void onWrite(PageRange[] pages, ParcelFileDescriptor destination, CancellationSignal cancellationSignal, WriteResultCallback callback) { // Write the bitmap to the output stream try { OutputStream out = new FileOutputStream(destination.getFileDescriptor()); bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); out.flush(); out.close(); callback.onWriteFinished(new PageRange[]{PageRange.ALL_PAGES}); } catch (Exception e) { callback.onWriteFailed(e.toString()); } } @Override public void onLayout(PrintAttributes oldAttributes, PrintAttributes newAttributes, CancellationSignal cancellationSignal, LayoutResultCallback callback, Bundle extras) { // Nothing to do here } } ``` 注意,这只是一个简单的示例,并且可能需要根据您的具体需求进行修改。在实际应用程序中,您可能需要为打印作业添加选项,例如页面大小和方向,以及打印前的预览等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值