Как распечатать WebView с помощью API печати KitKat 4.4 через отражение?

Мне нужно поддерживать печать на устройствах KitKat, но мой целевой SDK — 13 (изменение невозможно).

В частности, мне нужно распечатать веб-просмотр.

Это API для печати веб-просмотра: http://developer.android.com/training/printing/html-docs.html


person Randy    schedule 15.11.2013    source источник
comment
Почему вам нужно, чтобы целевой SDK оставался на уровне 13? Это переведет WebView в режим совместимости, что может привести к неожиданным результатам.   -  person Matt Gaunt    schedule 13.01.2014


Ответы (2)


Это старый, но печать полезна, так что это может быть полезно для правильной работы. (без отражения ;))

Улучшенный способ работы с устройствами версии. Не нужно пытаться поймать, просто нужно добавить несколько сообщений перед возвратом или просто скрыть кнопку/меню/... в зависимости от того же условия.

@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 и выше.

person AxelH    schedule 26.02.2015
comment
target SDK is 13 это причина, по которой я использовал отражение. Очевидно, я не хотел использовать отражение, но у меня не было возможности изменить цель. - person Randy; 26.02.2015
comment
Код работает на каждом SDK, он проверит SDK и, если он предшествует Kitkat, просто остановит метод печати. Это означает, что он поддерживает SDK 13 и обеспечивает функциональность печати для Kitkat по запросу. (@targetApi позволяет собрать apk с некоторыми неподдерживаемыми функциями) - person AxelH; 26.02.2015
comment
createPrintDocumentAdapter() теперь устарел, и для использования неустаревшей версии требуется API 21 (леденец на палочке)... Отличный шаг от Google - person FabioR; 17.06.2020
comment
@FabioR Я думаю, что именно тогда они представили службу печати ... в настройках устройства. Не уверен, я не работал на Android много лет... Думаю, здесь используется другой API. - person AxelH; 23.06.2020

Вот мое решение:

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+, будут аварийно завершать работу, если вы этого не сделаете.

person Randy    schedule 15.11.2013
comment
Использование try catch для обработки версий Android действительно не лучшее решение, лучше проверить версию сборки. developer.android.com/training/basics/supporting-devices/ - person animaonline; 27.01.2014