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

求适用于商米V2设备的Delphi FMX Android打印简易程序

适用于商米V2内置热敏打印机的Delphi FMX Android简易打印方案

你提供的代码依赖FMX的Printer组件,该组件仅支持Windows平台,Android环境下无法直接调用商米V2的内置热敏打印机。以下是针对Android平台的两种可行方案:


方案一:调用商米官方打印API(推荐)

商米V2自带专属打印服务,通过JNI桥接调用官方API能更好适配热敏打印特性,步骤如下:

1. 配置Android权限

在AndroidManifest.template.xml中添加权限声明:

<uses-permission android:name="com.squareup.sdk.permission.PRINT"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

2. Delphi代码实现

uses
  Androidapi.JNI.JavaTypes, Androidapi.JNI.GraphicsContentViewText,
  Androidapi.JNI.Os, Androidapi.Helpers;

procedure PrintThermalText(const AContent: string);
var
  JContext: JContext;
  JPrintIntent: JIntent;
begin
  // 获取当前App上下文
  JContext := TAndroidHelper.Context;
  // 初始化商米打印服务Intent
  JPrintIntent := TJIntent.JavaClass.init(StringToJString('com.squareup.sdk.print.action.PRINT'));
  
  // 设置打印内容(支持换行符#10)
  JPrintIntent.putExtra(StringToJString('content'), StringToJString(AContent));
  // 指定打印类型为热敏打印
  JPrintIntent.putExtra(StringToJString('print_type'), 0);
  // 启动打印服务
  JContext.startActivity(JPrintIntent);
end;

// 调用示例
procedure TForm1.btnPrintClick(Sender: TObject);
begin
  PrintThermalText('订单号:20240520001'#10'商品:热敏打印测试纸'#10'金额:10.00元'#10'打印时间:'+DateTimeToStr(Now));
end;

方案二:使用Android系统PrintManager(通用适配)

如果无需商米专属功能,可通过系统PrintManager实现打印,需手动适配热敏纸尺寸:

uses
  Androidapi.JNI.Print, Androidapi.JNI.GraphicsContentViewText,
  Androidapi.JNI.Os, Androidapi.Helpers, FMX.Types, FMX.Graphics;

procedure PrintBitmapToThermal(ABitmap: TBitmap);
var
  JPrintManager: JPrintManager;
  JContext: JContext;
  JPrintAdapter: JPrintDocumentAdapter;
  JAndroidBitmap: JBitmap;
begin
  JContext := TAndroidHelper.Context;
  // 获取系统PrintManager实例
  JPrintManager := TJPrintManager.Wrap(
    JContext.getSystemService(TJContext.JavaClass.PRINT_SERVICE));

  // 将FMX Bitmap转换为Android原生Bitmap
  JAndroidBitmap := TAndroidHelper.BitmapToJBitmap(ABitmap);

  // 创建打印文档适配器,处理布局与绘制
  JPrintAdapter := TJPrintDocumentAdapter.Create(
    // 布局回调:设置热敏纸尺寸(58mm纸对应203dpi宽度)
    procedure(OldParams, NewParams: JPrintAttributes;
      CancelSignal: JCancellationSignal; Callback: JPrintDocumentAdapter_OnLayoutResultCallback;
      Extra: JBundle)
    var
      JMediaSize: JMediaSize;
      JNewAttr: JPrintAttributes;
    begin
      JMediaSize := TJMediaSize.JavaClass.getMediaSize(
        TJMediaSize.JavaClass.ISO_A4, 203, 1000); // 宽度203px,高度自定义
      JNewAttr := TJPrintAttributes.Builder.JavaClass.init
        .setMediaSize(JMediaSize)
        .setResolution(TJPrintResolution.JavaClass.create(
          StringToJString('Thermal'), StringToJString('ThermalPrinter'), 203, 203))
        .build;
      Callback.onLayoutFinished(JNewAttr, False);
    end,
    // 绘制回调:输出Bitmap到打印页面
    procedure(PageNum: Integer; Attrs: JPrintAttributes;
      CancelSignal: JCancellationSignal; Callback: JPrintDocumentAdapter_OnWriteResultCallback;
      Extra: JBundle)
    begin
      TJCanvas.JavaClass.createBitmapCanvas(JAndroidBitmap);
      Callback.onWriteFinished(TJArray<Integer>.JavaClass.init(1, [PageNum]));
    end);

  // 启动打印任务
  JPrintManager.print(StringToJString('热敏打印任务'), JPrintAdapter, nil);
end;

// 调用示例
procedure TForm1.btnPrintBitmapClick(Sender: TObject);
begin
  PrintBitmapToThermal(Image1.Bitmap);
end;

注意事项

  • 商米V2默认热敏纸宽度为58mm,对应分辨率203dpi,设置参数时需匹配该尺寸,避免内容截断。
  • 使用商米官方API时,确保设备已预装商米打印服务(出厂默认自带)。
  • 所有打印功能需在真实商米V2设备上测试,Android模拟器无法模拟热敏打印硬件。

内容的提问来源于stack exchange,提问作者Jojo Imperial

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 07:40:33