Android打印使用自定义打印服务

时间:2016-12-30 15:13:18

标签: android printing

我正在尝试编写自定义Android打印服务。我按照以下博客中提到的说明操作: https://github.com/zaki50/MyPrintServiceProject

我能够创建一个执行打印作业的服务。但是这份工作没有印刷任何东西。我的问题是,我们应该提供什么localId。是打印机IP,名字?也有任何方法可以知道为什么打印作业不起作用。 基本上我关注的两个方法是添加onStartPrinterDiscovery和OnPrintJobQueue,如下所述:

  @Override
        public void onStartPrinterDiscovery(List<PrinterId> priorityList) {
            String str =     Settings.Secure.getString(getBaseContext().getContentResolver(), "enabled_print_services");

            Log.d("myprinter", "PrinterDiscoverySession#onStartPrinterDiscovery(priorityList: " + priorityList + ") called")

            final List<PrinterInfo> printers = new ArrayList<>();
            final PrinterId printerId = generatePrinterId("D8:49:2F:64:04:DB");
            final PrinterInfo.Builder builder = new PrinterInfo.Builder(printerId, "D8:49:2F:64:04:DB", PrinterInfo.STATUS_IDLE);
            PrinterCapabilitiesInfo.Builder capBuilder = new PrinterCapabilitiesInfo.Builder(printerId);
            capBuilder.addMediaSize(PrintAttributes.MediaSize.NA_LETTER, true);
            capBuilder.addMediaSize(PrintAttributes.MediaSize.NA_LETTER, false);
            capBuilder.addResolution(new PrintAttributes.Resolution("resolutionId", "default resolution", 600, 600), true);
            capBuilder.setColorModes(PrintAttributes.COLOR_MODE_COLOR | PrintAttributes.COLOR_MODE_MONOCHROME, PrintAttributes.COLOR_MODE_COLOR);
            builder.setCapabilities(capBuilder.build());
            printers.add(builder.build());
            addPrinters(printers);
        }

  @Override
protected void onPrintJobQueued(PrintJob printJob) {
    Log.d("myprinter", "queued: " + printJob.getId().toString());

    printJob.start();
    //printJob.complete();

    final PrintDocument document = printJob.getDocument();

    final FileInputStream in = new FileInputStream(document.getData().getFileDescriptor());
    try {
        final byte[] buffer = new byte[4];
        @SuppressWarnings("unused")
        final int read = in.read(buffer);
        Log.d("myprinter", "first " + buffer.length + "bytes of content: " + toString(buffer));
    } catch (IOException e) {
        Log.d("myprinter", "", e);
    } finally {
        try {
            in.close();
        } catch (IOException e) {
            assert true;
        }
    }
    if( printJob.isStarted()){
        printJob.complete();
    }

}

我的问题是应该是printerId(或localId)。我们如何知道printjob是成功还是失败

1 个答案:

答案 0 :(得分:0)

您可以检测打印作业状态with other methods in the class

if( printJob.isStarted() ){

}
else if( printJob.isCompleted() ){

}
else if( printJob.isCancelled() ){

}
else if( printJob.isFailed() ){

}

此外,打印服务还有自己的方法listed in the docs

@Override
protected void onPrintJobQueued(PrintJob printJob) {
    Log.d("printer", "queued: " + printJob.getId().toString());
    printJob.start();
    //...
    printJob.complete();
}

@Override
protected void onRequestCancelPrintJob(PrintJob printJob) {
    Log.d("printer", "canceled: " + printJob.getId().toString());
    printJob.cancel();
}