如何通过反射使用KitKat 4.4打印API打印WebView?

时间:2013-11-15 16:09:52

标签: android printing android-4.4-kitkat android-print-framework

我需要支持在KitKat设备上打印,但我的目标SDK是13(更改不是一个选项)。

具体来说,我需要打印一个webview。

这是用于打印webview的API: http://developer.android.com/training/printing/html-docs.html

2 个答案:

答案 0 :(得分:4)

它是一个旧的,但打印是有用的,所以这可能是正常工作的好。 (没有反思;))

使用设备版本的更好方法。不需要try-catch,只需要在返回之前添加一些消息,或者只是隐藏按钮/菜单/ ...取决于相同的条件。

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

    }

printJob将仅使用SDK 19及更高版本

执行

答案 1 :(得分:1)

这是我的解决方案:

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

确保在主线程上调用它。 另请注意:您需要使用try catch。如果不运行4.4+的设备将会崩溃。