如何在Expo React Native安卓端获取打印机并选择指定打印机?
安卓端替代Expo Print.selectPrinterAsync()的方案
方案1:利用安卓系统原生打印流程(无需手动获取列表)
Expo Print的selectPrinterAsync()仅iOS支持,但安卓系统的打印框架本身会在发起打印时自动弹出打印机选择界面。直接调用Print.printAsync(),用户就能在系统提供的界面中选择可用打印机,无需手动获取列表。
示例代码:
import * as Print from 'expo-print'; const printDocument = async () => { try { // 准备要打印的HTML内容 const htmlContent = ` <html> <body> <h1>测试打印内容</h1> <p>这是安卓端的测试打印文本</p> </body> </html> `; // 调用printAsync,安卓端自动弹出打印机选择界面 await Print.printAsync({ html: htmlContent }); } catch (error) { console.log('打印错误:', error); } };
方案2:自定义获取打印机列表(需脱离Expo Managed Workflow)
如果必须先获取打印机列表并自定义选择UI,需要切换到Expo Dev Client或者裸React Native项目,通过以下方式实现:
方法A:使用react-native-print库
该第三方库支持安卓端获取打印机列表,步骤如下:
- 安装依赖:
npm install react-native-print --save # 或 yarn add react-native-print - 基于Expo Dev Client构建项目后,调用获取打印机的方法:
import RNPrint from 'react-native-print'; const getPrinters = async () => { try { const printers = await RNPrint.getPrinters(); setAvailablePrinters(printers); // 返回格式示例:[{ name: "打印机名称", ipAddress: "192.168.1.100" }, ...] } catch (error) { console.log('获取打印机列表错误:', error); } };
方法B:编写安卓原生模块
若不想依赖第三方库,可自行编写安卓原生代码通过React Native Bridge暴露获取打印机的方法:
- 创建安卓原生模块类,通过
PrintManager查询可用打印机(需补充蓝牙/网络打印机扫描逻辑):import android.print.PrintManager; import android.print.PrintJobInfo; import android.content.Context; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.WritableArray; import com.facebook.react.bridge.WritableMap; import com.facebook.react.bridge.WritableNativeArray; import com.facebook.react.bridge.WritableNativeMap; public class PrinterModule extends ReactContextBaseJavaModule { public PrinterModule(ReactApplicationContext reactContext) { super(reactContext); } @Override public String getName() { return "PrinterModule"; } @ReactMethod public void getAvailablePrinters(Promise promise) { PrintManager printManager = (PrintManager) getReactApplicationContext().getSystemService(Context.PRINT_SERVICE); WritableArray printersArray = new WritableNativeArray(); for (PrintJobInfo jobInfo : printManager.getPrintJobs()) { WritableMap printerMap = new WritableNativeMap(); printerMap.putString("name", jobInfo.getPrinterName().toString()); printersArray.pushMap(printerMap); } promise.resolve(printersArray); } } - 注册模块后,在RN代码中调用:
import { NativeModules } from 'react-native'; const { PrinterModule } = NativeModules; const getPrinters = async () => { try { const printers = await PrinterModule.getAvailablePrinters(); setAvailablePrinters(printers); } catch (error) { console.log('获取打印机错误:', error); } };
注意:原生模块方案需额外处理蓝牙、网络打印机的扫描逻辑,适合具备原生开发能力的场景。
内容的提问来源于stack exchange,提问作者Sushanth
相关产品推荐
相关产品推荐

