求适用于商米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
相关产品推荐
相关产品推荐

