¿Cómo imprimo un webview con Kitkat 4.4 Imprimir API a través de la reflexión?
-
20-12-2019 - |
Pregunta
Necesito soportar impresión en dispositivos Kitkat, pero mi SDK objetivo es 13 (cambiando no es una opción).
Específicamente necesito imprimir un webview.
Esta es la API para imprimir un WebView: http://developer.android.com/training/printing/html-docs.html
Solución
Es un viejo, pero la impresión es útil para que esto podría ser bueno para funcionar correctamente.(Sin reflexión;))
Una mejor manera de trabajar con la versión de dispositivos.No se necesita una prueba de prueba, solo debe agregar algunos mensajes antes de la devolución o simplemente ocultar el botón / MENÚ / ... dependiendo de la misma condición.
@TargetApi(Build.VERSION_CODES.KITKAT)
private void createWebPrintJob(WebView webView) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
return;
// Get a PrintManager instance
PrintManager printManager = (PrintManager) getSystemService(Context.PRINT_SERVICE);
// Get a print adapter instance
PrintDocumentAdapter printAdapter = webView.createPrintDocumentAdapter();
// Create a print job with name and adapter instance
String jobName = getString(R.string.app_name) + " Document";
printManager.print(jobName, printAdapter,
new PrintAttributes.Builder().build());
}
El printjoB se ejecutará solo con SDK 19 y superior
Otros consejos
Aquí está mi solución:
public void print(WebView webView) {
//PrintManager
String PRINT_SERVICE = (String) Context.class.getDeclaredField("PRINT_SERVICE").get(null);
Object printManager = mActivity.getSystemService(PRINT_SERVICE);
//PrintDocumentAdapter
Class<?> printDocumentAdapterClass = Class.forName("android.print.PrintDocumentAdapter");
Method createPrintDocumentAdapterMethod = webview.getClass().getMethod("createPrintDocumentAdapter");
Object printAdapter = createPrintDocumentAdapterMethod.invoke(webview);
//PrintAttributes
Class<?> printAttributesBuilderClass = Class.forName("android.print.PrintAttributes$Builder");
Constructor<?> ctor = printAttributesBuilderClass.getConstructor();
Object printAttributes = ctor.newInstance(new Object[] {});
Method buildMethod = printAttributes.getClass().getMethod("build");
Object printAttributesBuild = buildMethod.invoke(printAttributes);
//PrintJob
String jobName = "My Document";
Method printMethod = printManager.getClass().getMethod("print", String.class, printDocumentAdapterClass, printAttributesBuild.getClass());
Object printJob = printMethod.invoke(printManager, jobName, printAdapter, printAttributesBuild);
// Save the job object for later status checking
mPrintJobs.add(printJob);
}
Solo asegúrese de que esto se llama en el hilo principal. TAMBIÉN NOTA: Necesitas usar una captura de prueba.Los dispositivos que no se ejecutan 4.4+ se bloquearán si no lo hace.