Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Android PrintManager取消打印作业?_Android_Kotlin_Printing - Fatal编程技术网

如何使用Android PrintManager取消打印作业?

如何使用Android PrintManager取消打印作业?,android,kotlin,printing,Android,Kotlin,Printing,我正在尝试使用Sunmi打印机打印文档。如果我单击“打印”,应用程序将崩溃,因为他没有从队列中取消已打印的文档。日志控制台中没有stacktrace或错误消息 private fun createWebPrintJob(webView:webView){ 我也遇到过类似的问题,我不知道这是否对你有帮助,但事情是这样的。 我的应用程序因已安排的打印作业而崩溃:我可以启动第一个打印作业,但如果我返回(在预览阶段,如取消)并启动一个新的打印作业,它会向我抛出一个“非法状态异常:打印已挂起” Print

我正在尝试使用Sunmi打印机打印文档。如果我单击“打印”,应用程序将崩溃,因为他没有从队列中取消已打印的文档。日志控制台中没有stacktrace或错误消息

private fun createWebPrintJob(webView:webView){


我也遇到过类似的问题,我不知道这是否对你有帮助,但事情是这样的。 我的应用程序因已安排的打印作业而崩溃:我可以启动第一个打印作业,但如果我返回(在预览阶段,如取消)并启动一个新的打印作业,它会向我抛出一个“非法状态异常:打印已挂起”

PrintDocumentAdapter可以控制打印机回调,但您使用的回调是由WebView定义的,因此您无法访问它们。您可以做的(我也做了)是创建一个类似这样的包装类(它是Java类,没有Kotlin):

您只需将在代码中定义的webview适配器传递给其构造函数。为避免与已计划的打印作业相关的错误,您应该在收到onWriteFinished()回调后启动新的打印作业。希望这对其他人有所帮助

附言:这门课需要放在安卓系统中。打印软件包才能工作

    // Get a PrintManager instance
    (getSystemService(Context.PRINT_SERVICE) as? PrintManager)?.let { printManager ->

        val jobName = "${getString(R.string.app_name)} Document"

        // Get a print adapter instance
        val printAdapter = webView.createPrintDocumentAdapter(jobName)

        // Create a print job with name and adapter instance
        val builder = PrintAttributes.Builder()
        val custom = PrintAttributes.MediaSize("SUNMI", "80mm x auto", 80, 1016)
        val customMargin = PrintAttributes.Margins(0, 0, 0, 0)

        builder.setMediaSize(custom)
        builder.setMinMargins(customMargin)
        println("manager ${printManager.printJobs}")
        try {
            printManager.print(
                    jobName,
                    printAdapter,
                    builder.build()
            )
        } catch (e: Exception) {
            println(e)
        }

        printManager.printJobs.forEach { item ->
            printManager.printJobs.remove(item)
        }


        println("manager ${printManager.printJobs}")

    }
}
package android.print;

import android.os.Build;
import android.os.Bundle;
import android.os.CancellationSignal;
import android.os.ParcelFileDescriptor;
import android.support.annotation.RequiresApi;

@RequiresApi(api = Build.VERSION_CODES.KITKAT)
public class PrintDocumentAdapterWrapper extends PrintDocumentAdapter {
    private final String TAG = PrintDocumentAdapterWrapper.class.getSimpleName();

    public static final int STATE_ON_START    = 1;
    public static final int STATE_ON_LAYOUT   = 2;
    public static final int STATE_ON_WRITE    = 3;
    public static final int STATE_ON_FINISHED = 4;

    public static final int STATE_ON_LAYOUT_FINISHED  = 5;
    public static final int STATE_ON_LAYOUT_FAILED    = 6;
    public static final int STATE_ON_LAYOUT_CANCELLED = 7;
    public static final int ON_LAYOUT_CANCEL_LISTENER = 8;

    public static final int STATE_ON_WRITE_FINISHED  = 9;
    public static final int STATE_ON_WRITE_FAILED    = 10;
    public static final int STATE_ON_WRITE_CANCELLED = 11;
    public static final int ON_WRITE_CANCEL_LISTENER = 12;

    private PrintDocumentAdapter adapter;
    private PrintAdapterCallback listener;

    public PrintDocumentAdapterWrapper(PrintDocumentAdapter adapter, PrintAdapterCallback listener){
        this.adapter = adapter;
        this.listener = listener;
    }

    @Override
    public void onStart() {
        listener.callback(STATE_ON_START);

        adapter.onStart();
    }

    @RequiresApi(api = Build.VERSION_CODES.KITKAT)
    @Override
    public void onLayout(PrintAttributes oldAttributes, PrintAttributes newAttributes, CancellationSignal cancellationSignal, final LayoutResultCallback callback, Bundle extras) {
        listener.callback(STATE_ON_LAYOUT);

        adapter.onLayout(oldAttributes, newAttributes, cancellationSignal, callback, extras);
    }

    @RequiresApi(api = Build.VERSION_CODES.KITKAT)
    @Override
    public void onWrite(PageRange[] pages, ParcelFileDescriptor destination, CancellationSignal cancellationSignal, final WriteResultCallback callback) {
        WriteResultCallback myCallback = new WriteResultCallback(){
            @Override
            public void onWriteFinished(PageRange[] pages) {
                super.onWriteFinished(pages);

                callback.onWriteFinished(pages);
                listener.callback(STATE_ON_WRITE_FINISHED);
            }

            @Override
            public void onWriteFailed(CharSequence error) {
                super.onWriteFailed(error);
                callback.onWriteFailed(error);
            }

            @Override
            public void onWriteCancelled() {
                super.onWriteCancelled();
                callback.onWriteCancelled();
            }
        };

        adapter.onWrite(pages, destination, cancellationSignal, myCallback);
    }

    @Override
    public void onFinish() {
        adapter.onFinish();
    }

    /* PrintAdapterCallback interface *************************************************************/
    public interface PrintAdapterCallback {
        void callback(int tag);
    }
}