Печать Android 4.4 - java.lang.IllegalStateException: печать уже ожидается

Я работаю над печатью веб-просмотра на Android. У меня возникла проблема, когда я получаю исключение из-за недопустимого состояния. Это происходит только тогда, когда я очень быстро вызываю "print" два (или более) раза. Сбой также не находится в моем стеке вызовов, поэтому использование try-catch не сработает.

Примечание. Я делаю вызовы через отражение (Как мне распечатать WebView с помощью API печати KitKat 4.4 через отражение?), но я почти уверен, что использование API сделает то же самое со мной (Но в конечном итоге я проверю ) (Редактировать: только что проверил. Сделал простое приложение с веб-представлением и кнопкой. Когда я очень быстро нажимаю кнопку два раза, все приложение падает.).

Трассировки стека:

java.lang.IllegalStateException: printing is already pending
  at com.android.org.chromium.android_webview.AwPdfExporter.exportToPdf(AwPdfExporter.java:51)
  at com.android.org.chromium.android_webview.AwPrintDocumentAdapter.exportPdf(AwPrintDocumentAdapter.java:100)
  at com.android.org.chromium.android_webview.AwPrintDocumentAdapter.onWrite(AwPrintDocumentAdapter.java:81)
  at android.print.PrintManager$PrintDocumentAdapterDelegate$MyHandler.handleMessage(PrintManager.java:609)
  at android.os.Handler.dispatchMessage(Handler.java:102)
  at android.os.Looper.loop(Looper.java:137)
  at android.app.ActivityThread.main(ActivityThread.java:4998)
  at java.lang.reflect.Method.invokeNative(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:515)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
  at dalvik.system.NativeStart.main(Native Method)

Вопрос: как этого избежать?

Изменить: это мое тестовое приложение. Если я дважды нажму кнопку до появления диалогового окна, я получу исключение, показанное выше. Как я могу избежать этого, не используя что-то вроде «хакерского» тайм-аута.

Основная активность.java:

package com.example.test;

import android.os.Bundle;
import android.print.PrintAttributes;
import android.print.PrintDocumentAdapter;
import android.print.PrintManager;
import android.app.Activity;
import android.content.Context;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = (Button) findViewById(R.id.button1);
        final WebView webview = (WebView) findViewById(R.id.webView1);
        webview.setWebViewClient(new WebViewClient());
        webview.loadUrl("http://google.com");

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        createWebPrintJob(webview);
                    }
                });
            }
        });
    }

    private void createWebPrintJob(WebView webView) {
        PrintManager printManager = (PrintManager) getSystemService(Context.PRINT_SERVICE);

        PrintDocumentAdapter printAdapter = webView.createPrintDocumentAdapter();
        String jobName = getString(R.string.app_name) + " Document";
        printManager.print(jobName, printAdapter, new PrintAttributes.Builder().build());
    }
}

Activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="fill"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <WebView
        android:id="@+id/webView1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="Button" />

</RelativeLayout>

person Randy    schedule 22.11.2013    source источник
comment
вы нашли решение этого. Даже я выгляжу похожим   -  person Nandakishore Shetty    schedule 01.10.2015
comment
тоже столкнулся с похожей проблемой, может кто нашел решение.   -  person livemaker    schedule 13.05.2019
comment
У меня была ошибка fd не может быть нулевой до того, как печать уже ожидается, потому что я не объявил FileProvider в манифесте... Поскольку я храню файл во внутренней памяти и делюсь им позже, я думаю, что он пытался писать на файл, и он сбой. Разочаровывает, что в ошибке не было ни единого упоминания о FileProvider... Что ж, надеюсь, это кому-то поможет.   -  person FabioR    schedule 23.10.2020


Ответы (1)


Это происходит потому, что при двойном нажатии кнопки создаются два задания на печать, а первое задание на печать еще не завершено.

Используйте обработчик задержки, чтобы отключить кнопку, это предотвратит случайное двойное нажатие пользователем.

Вы не сможете печатать, пока диспетчер очереди печати не будет очищен. Чтобы очистить диспетчер очереди печати, настройки -> Приложения -> Показать системные приложения -> выберите и снимите флажок для диспетчера очереди печати.

person livemaker    schedule 13.05.2019