You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET MAUI Android应用实现无用户干预的后台打印(跳过选打印机)

在.NET MAUI Android中实现无交互后台打印

要实现无用户干预的后台打印,核心是利用Android 10(API级别29)及以上提供的默认打印机指定能力,同时调整打印任务的创建逻辑。以下是具体实现方案:

前提条件

  • 目标Android版本需≥API 29(Android 10),低版本系统原生不支持直接指定默认打印机进行无交互打印。
  • 确保应用已配置必要权限:
    • 在AndroidManifest.xml中添加<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />(针对网络打印机场景)
    • Android 13及以上需添加<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />(打印任务通知权限)

代码修改与实现

1. 先等待WebView页面渲染完成(避免打印空白)

原代码直接加载HTML后立即打印,可能导致页面未渲染完成。需添加WebViewClient监听页面加载状态:

Context context = Platform.CurrentActivity;
Android.Webkit.WebView webView = new Android.Webkit.WebView(context);

webView.SetWebViewClient(new WebViewClient()
{
    public override void OnPageFinished(Android.Webkit.WebView view, string url)
    {
        base.OnPageFinished(view, url);
        // 页面加载完成后触发后台打印
        ExecuteBackgroundPrint(view, context);
    }
});

string htmlData = "test";
// 指定MIME类型避免渲染异常
webView.LoadData(htmlData, "text/html; charset=utf-8", null);

2. 实现指定默认打印机的后台打印逻辑

替换原有的printManager.Print调用,改为通过PrintJobInfo指定默认打印机:

private void ExecuteBackgroundPrint(Android.Webkit.WebView webView, Context context)
{
    PrintManager printManager = context.GetSystemService(Context.PrintService).JavaCast<PrintManager>();
    
    // 获取系统默认打印机
    Printer defaultPrinter = printManager.GetDefaultPrinter();
    if (defaultPrinter == null)
    {
        // 无默认打印机时的降级处理(比如提示用户设置默认打印机)
        return;
    }

    string jobName = "test";
    PrintAttributes printAttribute = new PrintAttributes.Builder()
                                        .SetMediaSize(PrintAttributes.MediaSize.NaLetter)
                                        .Build();

    // 构建打印任务信息,指定默认打印机ID并禁用用户交互
    PrintJobInfo.Builder jobInfoBuilder = new PrintJobInfo.Builder(
        printManager.GetNextPrintJobId(), 
        webView.CreatePrintDocumentAdapter(jobName), 
        printAttribute);
    jobInfoBuilder.SetPrinterId(defaultPrinter.Id);
    // 标记任务无需用户交互,直接后台执行
    jobInfoBuilder.SetFlags(PrintJobInfo.Flags.NoUserInteraction);

    // 提交打印任务
    printManager.Print(jobInfoBuilder.Build());
}

关键细节说明

  • PrintManager.GetDefaultPrinter():API 29新增方法,用于获取系统预设的默认打印机。
  • PrintJobInfo.Flags.NoUserInteraction:该标记会让系统跳过打印机选择、预览等交互步骤,直接使用指定打印机执行打印。
  • 若需兼容API 29以下版本,只能通过引导用户提前设置默认打印机,或接入第三方厂商提供的打印SDK来实现无交互打印,原生低版本系统不支持此能力。

内容的提问来源于stack exchange,提问作者Seeking guidance

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 19:05:22