2016-09-17 21 views
0

Ich habe eine Android-Anwendung entwickelt, die ein Foto mit PrintHelper oder HP Mobile Print SDK druckt. Wenn jedoch vor dem Druckvorgang Android Print Dialog auf dem Bildschirm angezeigt wird.Android-Druckdialog für HP-Drucker ausblenden

Wie kann ich den android-Druckdialog überspringen, wenn die Anwendung das Foto druckt?

Ich bin bereits unter Fragen gestoßen. Kurz gesagt, die Antworten lauten: "Es gibt keinen Weg dies zu tun."

Allerdings habe ich versucht,HP ePrint Android-Anwendung zu verwenden, jedes Foto zu drucken. In dieser Anwendung gibt es keinen Android-Druckdialog. Er kann jedes Dokument direkt drucken, ohne den Android-Druckdialog auf dem Bildschirm anzuzeigen.

Das heißt, es gibt eine Möglichkeit, ein Dokument direkt zu drucken.

+1

HP kann mit eigenen Druckern direkt arbeiten. Sie können nicht sehr leicht, da Sie nicht HP sind. – CommonsWare

+0

Beitreten zu CommonsWare und die anderen Antworten darauf, dass es nicht trivial ist. Du könntest dem Link folgen, der in einem Kommentar zu [this] (http://stackoverflow.com/questions/20005975/hide-android-kitkat-4-4-printing-dialog/31570215#31570215) -Antwort gegeben wurde (erklärte das gleiche Urteil) und sehen, ob es hilft. – Onik

Antwort

0

Es ist möglich, durch Aufruf der Druckadapter-Lebenszyklusmethoden für den Ausdruck in PDF zu drucken. Da Callbacks jedoch nicht öffentliche abstrakte Klassen sind und das System segfault auslöst, wenn Null angegeben wird, müssen Sie DexMaker verwenden, um sie zu implementieren. Ich habe für WebView-Adapter wie folgt implementiert:

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 
    printAdapter = webView.createPrintDocumentAdapter(); 
} 

@Override 
protected Void doInBackground(Void... voids) { 

    File file = new File(pdfPath); 
    if (file.exists()) { 
     file.delete(); 
    } 
    try { 
     file.createNewFile(); 

     // get file descriptor 
     descriptor = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_WRITE); 

     // create print attributes 
     PrintAttributes attributes = new PrintAttributes.Builder() 
       .setMediaSize(PrintAttributes.MediaSize.ISO_A4) 
       .setResolution(new PrintAttributes.Resolution("id", PRINT_SERVICE, 300, 300)) 
       .setColorMode(PrintAttributes.COLOR_MODE_COLOR) 
       .setMinMargins(new PrintAttributes.Margins(0, 0, 0, 0)) 
       .build(); 
     ranges = new PageRange[]{new PageRange(1, numberPages)}; 

     // dexmaker cache folder 
     cacheFolder = new File(context.getFilesDir() +"/etemp/"); 

     printAdapter.onStart(); 

     printAdapter.onLayout(attributes, attributes, new CancellationSignal(), getLayoutResultCallback(new InvocationHandler() { 
      @Override 
      public Object invoke(Object o, Method method, Object[] objects) throws Throwable { 

       if (method.getName().equals("onLayoutFinished")) { 
        onLayoutSuccess(); 
       } else { 
        Log.e(TAG, "Layout failed"); 
        pdfCallback.onPdfFailed(); 
       } 
       return null; 
      } 
     }, cacheFolder), new Bundle()); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     Log.e(TAG, e != null ? e.getMessage() : "PrintPdfTask unknown error"); 
    } 
    return null; 
} 

private void onLayoutSuccess() throws IOException { 
    PrintDocumentAdapter.WriteResultCallback callback = getWriteResultCallback(new InvocationHandler() { 
     @Override 
     public Object invoke(Object o, Method method, Object[] objects) throws Throwable { 
      if (method.getName().equals("onWriteFinished")) { 
       pdfCallback.onPdfCreated(); 
      } else { 
       Log.e(TAG, "Layout failed"); 
       pdfCallback.onPdfFailed(); 
      } 
      return null; 
     } 
    }, cacheFolder); 
    printAdapter.onWrite(ranges, descriptor, new CancellationSignal(), callback); 
} 


/** 
* Implementation of non public abstract class LayoutResultCallback obtained via DexMaker 
* @param invocationHandler 
* @param dexCacheDir 
* @return LayoutResultCallback 
* @throws IOException 
*/ 
public static PrintDocumentAdapter.LayoutResultCallback getLayoutResultCallback(InvocationHandler invocationHandler, 
                       File dexCacheDir) throws IOException { 
    return ProxyBuilder.forClass(PrintDocumentAdapter.LayoutResultCallback.class) 
      .dexCache(dexCacheDir) 
      .handler(invocationHandler) 
      .build(); 
} 

/** 
* Implementation of non public abstract class WriteResultCallback obtained via DexMaker 
* @param invocationHandler 
* @param dexCacheDir 
* @return LayoutResultCallback 
* @throws IOException 
*/ 
public static PrintDocumentAdapter.WriteResultCallback getWriteResultCallback(InvocationHandler invocationHandler, 
                       File dexCacheDir) throws IOException { 
    return ProxyBuilder.forClass(PrintDocumentAdapter.WriteResultCallback.class) 
      .dexCache(dexCacheDir) 
      .handler(invocationHandler) 
      .build(); 
} 
Verwandte Themen