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