Flutter USB打印插件android_usb_printer的使用

Flutter USB打印插件android_usb_printer的使用

android_usb_printer

Flutter Android端插件,提供操作USB打印机的方法能力。

使用方法

  1. 添加依赖

    pubspec.yaml 文件中添加以下依赖:

    dependencies:
      android_usb_printer: ^0.0.1
    
  2. 发送打印字节数组示例

    下面是一个发送打印字节数组的示例代码:

    import 'package:flutter/services.dart';
    import 'package:android_usb_printer/android_usb_printer.dart';
    
    // 假设你已经有了usbDeviceInfo和bytes变量
    var result = await AndroidUsbPrinterPlatform.instance.writeBytes(
        usbDeviceInfo,
        bytes,
    );
    

提供API方法

以下是插件提供的API方法:

/// 获取本地打印机列表
Future<List<UsbDeviceInfo>> queryLocalUsbDevice()

/// 打印机发送字节数据
/// @param singleLimit, 单次最大传输字节长度,内部会将 bytes 按照 singleLimit 阈值进行切割分组后依次 write
Future<int> writeBytes(UsbDeviceInfo usbDeviceInfo, List<int> bytes, {int singleLimit = -1})

/// 接收打印机字节数据
/// @param timeOut, timeOut毫秒内无接收数据直接返回null
Future<Uint8List?> readBytes(UsbDeviceInfo usbDeviceInfo, {int timeOut = 2000})

/// 获取打印机连接状态
Future<bool> checkDeviceConn(UsbDeviceInfo usbDeviceInfo)

/// 打印机连接
Future<bool> connect(UsbDeviceInfo usbDeviceInfo)

/// 打印机断开连接
Future<bool> disconnect(UsbDeviceInfo usbDeviceInfo)

/// 获取打印机设备权限
Future<bool> checkDevicePermission(UsbDeviceInfo usbDeviceInfo)

/// 申请打印机设备权限
Future<bool> requestDevicePermission(UsbDeviceInfo usbDeviceInfo)

/// 删除原生层中 usb conn 缓存(删除设备时可调用)
Future<dynamic> removeUsbConnCache(UsbDeviceInfo usbDeviceInfo)

提供监听USB插拔,USB设备授权能力

通过监听USB插拔事件和USB设备授权事件,你可以实时获取USB设备的状态变化。示例如下:

AndroidUsbPrinterPlatform.instance.usbPlugInfoStream.listen((usbPlugInfo) {
  final usbDeviceInfo = usbPlugInfo.usbDevice; // 插入的USB设备信息,包括 vId, pId, sId
  final plug = usbPlugInfo.plug; // 消息类型枚举(包含状态:拔出、插入、授权成功)
});

UsbPlugInfo 结构如下:

class UsbPlugInfo {
  final UsbPlugInfoEnum plug;
  final UsbDeviceInfo usbDevice;

  UsbPlugInfo(this.usbDevice, this.plug);
}

enum UsbPlugInfoEnum {
  attached, // 插入
  detached, // 拔出
  granted, // 授权成功
}

完整示例Demo

以下是一个完整的示例代码,展示了如何使用该插件:

import 'package:flutter/material.dart';
import 'dart:async';

import 'package:flutter/services.dart';
import 'package:android_usb_printer/android_usb_printer.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _platformVersion = 'Unknown';
  final _androidUsbPrinterPlugin = AndroidUsbPrinterPlatform.instance;

  [@override](/user/override)
  void initState() {
    super.initState();
    initPlatformState();
  }

  // Platform messages are asynchronous, so we initialize in an async method.
  Future<void> initPlatformState() async {
    String platformVersion;
    // Platform messages may fail, so we use a try/catch PlatformException.
    // We also handle the message potentially returning null.
    try {
      platformVersion = await _androidUsbPrinterPlugin
              .queryLocalUsbDevice()
              .then(
                  (value) => value.map((e) => e.toMap()).toList().toString()) ??
          'Unknown platform version';
    } on PlatformException {
      platformVersion = 'Failed to get platform version.';
    }

    // If the widget was removed from the tree while the asynchronous platform
    // message was in flight, we want to discard the reply rather than calling
    // setState to update our non-existent appearance.
    if (!mounted) return;

    setState(() {
      _platformVersion = platformVersion;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Center(
          child: Text('Running on: $_platformVersion\n'),
        ),
      ),
    );
  }
}

更多关于Flutter USB打印插件android_usb_printer的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter USB打印插件android_usb_printer的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter项目中,使用android_usb_printer插件来实现USB打印功能,可以通过以下步骤进行。以下是一个基本的代码案例,展示如何集成和使用该插件。

1. 添加依赖

首先,在pubspec.yaml文件中添加android_usb_printer依赖:

dependencies:
  flutter:
    sdk: flutter
  android_usb_printer: ^最新版本号 # 请替换为实际最新版本号

然后运行flutter pub get来安装依赖。

2. 配置Android权限

android/app/src/main/AndroidManifest.xml中添加USB权限:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">

    <uses-permission android:name="android.permission.USB_PERMISSION" />
    <uses-feature android:name="android.hardware.usb.host" />

    <!-- 其他配置 -->

</manifest>

3. 初始化插件和查找USB设备

在Dart代码中,初始化插件并查找连接的USB打印机设备。以下是一个示例:

import 'package:flutter/material.dart';
import 'package:android_usb_printer/android_usb_printer.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  UsbPrinter? _printer;
  List<UsbDevice> _usbDevices = [];

  @override
  void initState() {
    super.initState();
    _initUsbPrinter();
  }

  Future<void> _initUsbPrinter() async {
    // 初始化插件
    UsbPrinter.init();

    // 请求USB权限(在实际应用中,你可能需要更细致地处理权限请求)
    UsbPermissionManager.requestUsbPermission().then((bool granted) {
      if (granted) {
        // 获取已连接的USB设备
        UsbDevice.getUsbDevices().then((devices) {
          setState(() {
            _usbDevices = devices;
            // 假设第一个设备是我们要使用的打印机(实际应用中需要更具体的识别逻辑)
            if (devices.isNotEmpty) {
              _printer = UsbPrinter(devices.first);
            }
          });
        });
      } else {
        // 处理权限被拒绝的情况
        print("USB permission denied");
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('USB Printer Demo'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text('Connected USB Devices: $_usbDevices.length'),
              ElevatedButton(
                onPressed: _printText,
                child: Text('Print Text'),
              ),
            ],
          ),
        ),
      ),
    );
  }

  Future<void> _printText() async {
    if (_printer != null) {
      try {
        String text = "Hello, USB Printer!";
        await _printer!.printRawText(text.codeUnits);
        print("Text printed successfully");
      } catch (e) {
        print("Failed to print: $e");
      }
    } else {
      print("No printer found");
    }
  }
}

注意事项

  1. 权限处理:在实际应用中,需要更细致地处理USB权限请求,特别是在Android 6.0及以上版本。
  2. 设备识别:上述代码假设第一个连接的USB设备是打印机,实际应用中需要更具体的识别逻辑,比如通过VID(Vendor ID)和PID(Product ID)来识别。
  3. 打印内容格式printRawText方法直接发送原始字节数据到打印机,因此需要根据打印机的指令集来格式化打印内容。

总结

上述代码提供了一个基本的框架,展示了如何在Flutter项目中使用android_usb_printer插件来实现USB打印功能。实际应用中可能需要根据具体需求进行调整和扩展。

回到顶部