2016-12-30 248 views
0

我想写一个自定义的android打印服务。我遵循以下博客中提到的说明: https://github.com/zaki50/MyPrintServiceProjectAndroid打印使用自定义打印服务

我能够创建一个服务,它执行打印作业。但是在作业没有打印任何东西之后。我的问题是,我们应该提供什么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)。我们如何知道,如果将打印作业成功或失败

+0

请在SO上发布时添加代码示例。 –

+0

我编辑的问题与代码示例,我需要更多的信息。 –

+0

你看过使用打印管理器和适配器吗? https://developer.android.com/training/printing/custom-docs.html#print-manager –

回答

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(); 
} 
+0

感谢Serg为您提供的信息。我目前使用PrintHelper类(https://developer.android.com/reference/android/support/v4/print/PrintHelper.html) –

+0

也可以请让我知道什么localId和PrinterId应该。是否与IP地址或MAC地址相同 –

+0

android spooler将作业传送到打印机。有任何机构遇到此问题。我已验证printerId指向打印机的IP地址 –