2016-09-17 2 views
0

J'ai développé une application Android qui imprime une photo en utilisant PrintHelper ou Hp mobile print SDK. Cependant, lorsqu'avant le processus d'impression, la boîte de dialogue d'impression Android s'affiche à l'écran. Comment puis-je ignorer la boîte de dialogue d'impression android lorsque l'application imprime la photo?Masquer la boîte de dialogue d'impression Android pour les imprimantes Hp

J'ai déjà rencontré des questions ci-dessous. Brièvement, les réponses sont "il n'y a aucun moyen de le faire."

Cependant, j'ai essayé d'utiliser HP ePrint application android pour imprimer la photo. Dans cette application, il n'y a aucune boîte de dialogue d'impression Android, il peut imprimer n'importe quel document directement, sans afficher la boîte de dialogue d'impression Android sur l'écran. Donc, cela signifie qu'il existe un moyen d'imprimer directement un document.

+1

HP peut travailler directement avec ses propres imprimantes. Vous ne pouvez pas très facilement, car vous n'êtes pas HP. – CommonsWare

+0

Joignez-vous à CommonsWare et les autres réponses mentionnées que ce n'est pas trivial. Vous pouvez suivre le lien fourni dans un commentaire à [this] (http://stackoverflow.com/questions/20005975/hide-android-kitkat-4-4-printing-dialog/31570215#31570215) réponse (a déclaré le même verdict) et voir si ça aide. – Onik

Répondre

0

Il est possible d'imprimer en PDF en appelant les méthodes de cycle de vie de l'adaptateur d'impression. Cependant, comme les callbacks sont des classes abstraites non publiques et que le système lance segfault si null est fourni, vous devez utiliser DexMaker pour les implémenter. J'ai mis en œuvre pour l'adaptateur webView comme ceci:

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