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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top