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,一套比較标准的打印代码例 ...
随机推荐
- [物理学与PDEs]第1章习题1 无限长直线的电场强度与电势
设有一均匀分布着电荷的无限长直线, 其上的电荷线密度 (即单位长度上的电荷量) 为 $\sigma$. 试求该直线所形成的电场的电场强度及电势. 解答: 设空间上点 $P$ 到直线的距离为 $r$, ...
- [物理学与PDEs]第1章第6节 电磁场的标势与矢势 6.3 例 --- 电偶极辐射
1. 偶极子: 相距为 $l$, 带电量分别为 $\pm q$ 的一对电荷组成的系统. 称 $$\bex {\bf m}=q{\bf l} \eex$$ 为电偶极矩, 其中 ${\bf l}$ 为 $ ...
- Maven安装及配置
第1部分 准备 1.1 安装JDK和Eclipse: 1.2 下载Maven(https://maven.apache.org/download.cgi) 第2部分 2.1 安装Maven 2.1.1 ...
- springMVC中 @RequestParam和@RequestBody的区别
首先,不可以同时传进@RequestParam和@RequestBody,好像可以传进两个@RequestParam 如果不加@requestparam修饰,相当于 加上@requestparam且各 ...
- 使用PHP中的ajax做登录页面、验证用户名是否可用、动态调用数据库
1.ajax的基础知识 ajax是结合了jquery.php等几种技术延伸出来的综合运用的技术,不是新的内容.ajax也是写在<script>标签里面的. 如果使用ajax一定是要有1个处 ...
- vue学习之组件
组件从注册方式分为全局组件和局部组件. 从功能类型又可以分为偏视图表现的(presentational)和偏逻辑的(动态生成dom),推荐在前者中使用模板,在后者中使用 JSX 或渲染函数动态生成组件 ...
- 20175204 张湲祯 2018-2019-2《Java程序设计》第二周学习总结
20175204 张湲祯 2018-2019-2<Java程序设计>第二周学习总结 教材学习内容总结 -第二章基本数据类型与数组要点: -标识符与关键字:标识符的第一个字符不能是数字字符: ...
- 10. linux输入子系统/input 设备【转】
转自:https://www.cnblogs.com/crmn/articles/6696819.html 按键事件信息之上报绝对事件信息之上报相对事件信息之上报功能键驱动编写多点触控事件的上报 只产 ...
- 提升Tesseract-OCR输出的质量
图片处理 修改比例(Rescaling) 二值化(Binarisation) 去除噪点(Noise Removal) 旋转/偏移校正(Rotation / Deskewing) 边界(Borders) ...
- Java_Number(装箱和拆箱)
所有的包装类(Integer.Long.Byte.Double.Float.Short)都是抽象类Number子类 装箱: 自动将基本数据类型装换为包装器类型 拆箱: 自动将包装器类型转换为基本数据类 ...