PrintService类打印
系统打印服务框架代码位于android.printservice包中。系统并没有实现具体打印功能,需要打印机厂商制作插件接入系统打印服务之后,自行实现
主要类:
PrintDocument:表示待打印文件
PrintDiscoverySession:用于发现打印机和打印机状态更新
PrintJob:代表打印任务
PrintService:接入系统打印Service
打印机发现过程:
当用户在设置里开启你的打印服务插件和进入系统打印服务界面时,系统会调用 PrinterDiscoverySession 里的 onStartPrinterDiscovery(List priorityList) 函数,通知你的插件查找打印机。具体查找方式需要自己实现,可能是查找USB接口,可能是搜索网络。系统只管结果,你通过调用其父类的 addPrinters() 方法将打印机添加进去。打印机是放在List数组里传入。
打印机选择过程
当用户通过一些有打印功能的APP调用系统打印服务时,如果选择了你的插件的打印机,那么系统会调用 PrinterDiscoverySession 里的 onStartPrinterStateTracking(PrinterId printerId) 方法。这里系统主要希望得到打印机的 PrinterCapabilitiesInfo 和状态,里面包括打印机支持的纸张大小,以及色彩等详细功能参数。
打印过程:
当用户在刚刚的系统打印服务界面点击右上角的打印按钮时,系统会调用打印机所属的 PrintService 里的 onPrintJobQueued(PrintJob printJob) 方法,插件需要处理该 PrintJob 。首先需要通过 PrintJob.isQueued() 判断,该PrintJob是否准备好打印,返回true代表可以打印。然后可以通过 PrintJob.getDocument() 获得要打印的文档,这里面的数据可以通过 PrintDocument.getData() 读取。开始打印的时候,调用PrintJob.start()标记开始状态。当打印成功时,调用 PrintJob.complete() 标记打印成功。或者打印失败时,调用 PrintJob.fail( String) 标记失败。
打印服务需要添加的权限:
<uses-permission android:name="android.permission.START_PRINT_SERVICE_CONFIG_ACTIVITY" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
打印类:
public class MyPrintService extends PrintService {
private static final String TAG = "MyPrintService";
@Override
protected PrinterDiscoverySession onCreatePrinterDiscoverySession() {
Log.d(TAG, "onCreatePrinterDiscoverySession()");
return new MyPrintDiscoverySession(this);
}
@Override
protected void onRequestCancelPrintJob(PrintJob printJob) {
Log.d(TAG, "onRequestCancelPrintJob()");
printJob.cancel();
}
@Override
protected void onPrintJobQueued(PrintJob printJob) {
Log.d(TAG, "onPrintJobQueued()");
PrintJobInfo printjobinfo = printJob.getInfo();
PrintDocument printdocument = printJob.getDocument();
if (printJob.isQueued()) {
return;
}
printJob.start();
String filename = "docu.pdf";
File outfile = new File(this.getFilesDir(), filename);
outfile.delete();
FileInputStream file = new ParcelFileDescriptor.AutoCloseInputStream(printdocument.getData());
//创建一个长度为1024的内存空间
byte[] bbuf = new byte[1024];
//用于保存实际读取的字节数
int hasRead = 0;
//使用循环来重复读取数据
try {
FileOutputStream outStream = new FileOutputStream(outfile);
while ((hasRead = file.read(bbuf)) > 0) {
//将字节数组转换为字符串输出
//System.out.print(new String(bbuf, 0, hasRead));
outStream.write(bbuf);
}
outStream.close();
} catch (IOException e) {
e.printStackTrace();
}finally {
//关闭文件输出流,放在finally块里更安全
try {
file.close();
} catch (IOException e) {
e.printStackTrace();
}
}
printJob.complete();
}
}
PrinterDiscoverySession实现类编写:
public class MyPrintDiscoverySession extends PrinterDiscoverySession {
private static final String TAG = "MyPrintDiscoverySession";
private final MyPrintService myPrintService;
public MyPrintDiscoverySession(MyPrintService myPrintService) {
Log.d(TAG, "MyPrintDiscoverySession()");
this.myPrintService = myPrintService;
}
@Override
public void onStartPrinterDiscovery(List<PrinterId> priorityList) {
Log.d(TAG, "onStartPrinterDiscovery()");
List<PrinterInfo> printers = this.getPrinters();
String name = "printer1";
PrinterInfo myprinter = new PrinterInfo
.Builder(myPrintService.generatePrinterId(name), name, PrinterInfo.STATUS_IDLE)
.build();
printers.add(myprinter);
addPrinters(printers);
}
@Override
public void onStopPrinterDiscovery() {
Log.d(TAG, "onStopPrinterDiscovery()");
}
/**
* 确定这些打印机存在
* @param printerIds
*/
@Override
public void onValidatePrinters(List<PrinterId> printerIds) {
Log.d(TAG, "onValidatePrinters()");
}
/**
* 选择打印机时调用该方法更新打印机的状态,能力
* @param printerId
*/
@Override
public void onStartPrinterStateTracking(PrinterId printerId) {
Log.d(TAG, "onStartPrinterStateTracking()");
PrinterInfo printer = findPrinterInfo(printerId);
if (printer != null) {
PrinterCapabilitiesInfo capabilities =
new PrinterCapabilitiesInfo.Builder(printerId)
.setMinMargins(new PrintAttributes.Margins(200, 200, 200, 200))
.addMediaSize(PrintAttributes.MediaSize.ISO_A4, true)
//.addMediaSize(PrintAttributes.MediaSize.ISO_A5, false)
.addResolution(new PrintAttributes.Resolution("R1", "200x200", 200, 200), false)
.addResolution(new PrintAttributes.Resolution("R2", "300x300", 300, 300), true)
.setColorModes(PrintAttributes.COLOR_MODE_COLOR
| PrintAttributes.COLOR_MODE_MONOCHROME,
PrintAttributes.COLOR_MODE_MONOCHROME)
.build();
printer = new PrinterInfo.Builder(printer)
.setCapabilities(capabilities)
.setStatus(PrinterInfo.STATUS_IDLE)
// .setDescription("fake print 1!")
.build();
List<PrinterInfo> printers = new ArrayList<PrinterInfo>();
printers.add(printer);
addPrinters(printers);
}
}
@Override
public void onStopPrinterStateTracking(PrinterId printerId) {
Log.d(TAG, "onStopPrinterStateTracking()");
}
@Override
public void onDestroy() {
Log.d(TAG, "onDestroy()");
}
private PrinterInfo findPrinterInfo(PrinterId printerId) {
List<PrinterInfo> printers = getPrinters();
final int printerCount = getPrinters().size();
for (int i = 0; i < printerCount; i++) {
PrinterInfo printer = printers.get(i);
if (printer.getId().equals(printerId)) {
return printer;
}
}
return null;
}
}
PrintService类打印的更多相关文章
- java File类 打印目录树状结构(递归)
import java.io.File; /** * 递归遍历 * */ public class FieTree { public static void main(String[] args) { ...
- 封装一个简单好用的打印Log的工具类And快速开发系列 10个常用工具类
快速开发系列 10个常用工具类 http://blog.csdn.net/lmj623565791/article/details/38965311 ------------------------- ...
- 【转】C#使用PrintDocument打印 多页 打印预览
PrintDocument实例所有的订阅事件如下: 创建一个PrintDocument的实例.如下: System.Drawing.Printing.PrintDocument docToPrint ...
- C#使用PrintDocument打印 多页 打印预览
PrintDocument实例所有的订阅事件如下: 创建一个PrintDocument的实例.如下: System.Drawing.Printing.PrintDocument docToPrint ...
- socket实现手机连接网络打印机打印pos单
打印的工具类: public class PrintLine { String TAG = "xxl"; static String PRINT_IP = "192. ...
- Java的类演进过程
1.从面向过程到面向对象 在大家最熟悉的C语言中,如果要定义一个复杂的数据类型就用结构体(Struct)来实现,而为结构体的每个操作都定义一个函数,这个函数与结构体本身的定义没有任何关系.程序的重心集 ...
- 关于JFace中的对话框MessageDialog类等其它类型对话框
对话框是软件系统中最常用到的界面,对话框无处不在,从界面结构来说,对话框主要是由主体的界面组件和底部窗体按钮组成. 之前的例子中已经频繁的使用到了MessageDialog.openInformati ...
- android开发必备日志打印工具类
今天给大家献上一款好用的日志打印工具.大家在平时的开发中用的最多的可能就是Log.i("",""),Log.e("","" ...
- 关于这两天研究Java打印pdf方法的记录
这两天在研究Java调用打印机打印PDF文件的方法,学到了不少东西,特别来记录一下. 关于Java打印网上最多的而且也是Java正统的打印方法就是使用PrintService,一套比較标准的打印代码例 ...
随机推荐
- logging模块简单使用
日志配置 #!/usr/bin/python2.7 import os import logging def get_logger(path='./', filename='access.log', ...
- Beamer 目录分栏
导言区加入 \usepackage{multicol} 然后 \section*{目录} \frame{\begin{multicols}{} \tableofcontents[hideallsubs ...
- 轴对称 Navier-Stokes 方程组的点态正则性准则 II
在 [Wei, Dongyi. Regularity criterion to the axially symmetric Navier-Stokes equations. J. Math. Anal ...
- 关于redis服务无法启动问题
打开cmd终端找到redis安装路径下 输入redis-server redis.windows.conf报错信息如下 之后重新输入redis-cli.exe 运行结果 然后输入 127.0.0.1: ...
- linux 批量测试域名返回码脚本
需求:应用要求覆盖host并测试 1.创建一个host.txt的文件来存放需要修改的host记录 2.过滤出host.txt域名列并新生成一个curl.txt文件 cat host.txt |awk ...
- Python 通用爬虫 和讯博客 scrapy
目标站点需求分析 通用爬虫,获取和讯博客所有博文 涉及的库 scrapy,re,requests,mysql URL RULE 解析单页源码 保存到数据库 结果
- JAVA 数组元素的反转
package Code411;/*数组元素的反转本来[1,2,3,4]反转后[4,3,2,1]1.对称位置的元素交换2.对称位子需要两个索引3.int temp =a:a=b;b=temp;4.什么 ...
- select获取选中的option(包含value和text,重点是text怎么获取)
简单描述:后台需要获取到select标签选择的内容,也就是text,该怎么取呢?很简单. 代码: //hml代码<div class="col-md-6"> <l ...
- java----Maven
下载地址 http://maven.apache.org/download.cgi 介绍 bin:运行脚本 windows 输入mvn可以运行这些脚本 boot:包含一个类加载器的框架,maven使用 ...
- Selenium+Python ---- 免登录
1.免登录在进行测试的过程中难免会遇到登录的情况,给测试工作添加了工作量,本文仅提供一些思路供参考解决方式:手动请求中添加cookies.火狐的profile文件记录信息实现.人工介入.万能验证码.去 ...