Flutter音频播放插件topwisemp35p的使用

简介

topwisemp35p 是一个用于干扰 Topwise MP35P 便携式设备的插件。


开始使用

如何开始

此插件暴露了两个 API:

AndroidManifest.xml 文件中添加以下内容:

<application
    android:name="com.a5starcompany.topwisemp35p.PaylonyApp">
</application>

并在 <application> 标签内添加以下服务:

<service
    android:name="com.a5starcompany.topwisemp35p.emvreader.card.CardMoniterService"
    android:enabled="true" />

使用步骤

1. 初始化插件

首先需要初始化插件。这应该只执行一次。

import 'package:topwisemp35p/topwisemp35p.dart';

class _MyAppState extends State<MyApp> {
  final _topwisemp35pPlugin = Topwisemp35p();

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

2. 初始化支付

创建一个 Transaction 对象并传递给 initializePayment 函数。

Future<void> initPayment() async {
  _topwisemp35pPlugin.initialize("2000");
}

3. 监听卡状态

监听卡事件以了解卡的状态,并根据状态执行相应的操作。

_topwisemp35pPlugin.stateStream.listen((values) async {
  print("卡状态: $values");

  // 根据状态处理逻辑
  switch (values["state"]) {
    case "Loading":
      showDialog(
        context: context,
        builder: (builder) => AlertDialog(
          title: Text("加载中"),
        ),
      );
      return;

    case "CardData":
      // 处理卡数据
      return;

    case "CardReadTimeOut":
      return;

    case "CallBackError":
      return;

    case "CallBackCanceled":
      return;

    case "CallBackTransResult":
      return;

    case "CardDetected":
      // 跳转到输入 PIN 页面
      var result = await Navigator.push(
        context,
        MaterialPageRoute(builder: (context) => Carpin(amount: "200")),
      );

      if (result != null) {
        _topwisemp35pPlugin.enterpin(result);
      }
      return;
  }
});

4. 自定义卡 PIN 布局

将用户输入的 PIN 发送回 SDK,等待响应。

_topwisemp35pPlugin.enterpin(result);

5. 提现收据打印

创建一个 Print 对象并传递给 startprinting 函数。

var args = Print(
  marchantname: "VERDANT MICROFINANCE BANK",
  datetime: "27 Jan 2023,06:55AM",
  terminalid: "2LUX4199",
  merchantid: "2LUXAA00000001",
  transactiontype: "CARD WITHDRAWAL",
  copytype: "Merchant",
  rrn: "561409897476",
  stan: "904165",
  pan: "539983******1954",
  expiry: "2303",
  transactionstatus: "DECLINED",
  responsecode: "55",
  message: "Incorrect PIN",
  appversion: "1.5.3",
  amount: "200",
  bottommessage: "Buy Airtime and Pay Electricity bills here anytime! AnyDAY!",
);

_topwisePlugin.startprinting(args).then((value) {
  print(value);
});

6. 转账收据打印

类似提现收据打印,只需修改部分字段。

var args = Print(
  marchantname: "VERDANT MICROFINANCE BANK",
  datetime: "27 Jan 2023,06:55AM",
  terminalid: "2LUX4199",
  merchantid: "2LUXAA00000001",
  transactiontype: "TRANSFER",
  accountname: "ODEJINMI TOLUWALOPE ABRAHAM",
  copytype: "Merchant",
  stan: "904165",
  accountnumber: "3076302098",
  bank: "First Bank",
  transactionstatus: "DECLINED",
  responsecode: "55",
  message: "Incorrect PIN",
  appversion: "1.5.3",
  amount: "200",
  bottommessage: "Buy Airtime and Pay Electricity bills here anytime! AnyDAY!",
);

_topwisePlugin.startprinting(args).then((value) {
  print(value);
});

7. 自定义打印布局

在设计自定义打印 UI 时,请注意以下几点:

  1. 一行不能超过两个 Widget
  2. SDK 只支持有限的 Widget,包括:Column, Row, Container, Expanded, Text, Image, Divider
  3. 如果需要打印列表,请避免使用 ListView,可以使用 for 循环。
  4. 如果使用了上述列表之外的 Widget,SDK 将将其视为空白。

示例代码

以下是完整的示例代码:

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

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

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

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

class _MyAppState extends State<MyApp> {
  final _topwisemp35pPlugin = Topwisemp35p();

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

  Future<void> _initPayment() async {
    await _topwisemp35pPlugin.initialize("2000");
    _listenToCardState();
  }

  void _listenToCardState() {
    _topwisemp35pPlugin.stateStream.listen((values) async {
      print("卡状态: $values");

      switch (values["state"]) {
        case "Loading":
          showDialog(
            context: context,
            builder: (builder) => AlertDialog(
              title: Text("加载中"),
            ),
          );
          return;

        case "CardDetected":
          var result = await Navigator.push(
            context,
            MaterialPageRoute(builder: (context) => Carpin(amount: "200")),
          );

          if (result != null) {
            _topwisemp35pPlugin.enterpin(result);
          }
          return;
      }
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Topwise MP35P Demo',
      theme: ThemeData(
        primaryColor: Colors.green,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Topwise MP35P 示例'),
        ),
        body: Center(
          child: Text('初始化完成!'),
        ),
      ),
    );
  }
}

更多关于Flutter音频播放插件topwisemp35p的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter音频播放插件topwisemp35p的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


topwisemp35p 是一个用于在 Flutter 应用中播放音频的插件,通常用于特定的硬件设备或定制需求。以下是如何在 Flutter 项目中使用 topwisemp35p 插件的步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 topwisemp35p 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  topwisemp35p: ^版本号  # 请替换为最新的版本号

然后,运行 flutter pub get 来获取依赖。

2. 导入插件

在需要使用 topwisemp35p 插件的 Dart 文件中导入它:

import 'package:topwisemp35p/topwisemp35p.dart';

3. 初始化插件

在使用插件之前,通常需要对其进行初始化:

Topwisemp35p.initialize();

4. 播放音频

使用 play 方法来播放音频文件。你需要提供音频文件的路径:

String audioFilePath = 'path/to/your/audio/file.mp3';
Topwisemp35p.play(audioFilePath);

5. 控制播放

你可以使用插件的其他方法来控制音频的播放,例如暂停、停止、调整音量等:

  • 暂停播放:

    Topwisemp35p.pause();
    
  • 恢复播放:

    Topwisemp35p.resume();
    
  • 停止播放:

    Topwisemp35p.stop();
    
  • 调整音量:

    int volumeLevel = 50; // 音量范围通常是 0 到 100
    Topwisemp35p.setVolume(volumeLevel);
    

6. 监听播放状态

你可以监听音频播放的状态,以便在 UI 中更新播放进度或处理播放完成事件:

Topwisemp35p.onPlaybackStateChanged.listen((state) {
  print('Playback state changed: $state');
});

7. 释放资源

在不再需要播放音频时,释放插件占用的资源:

Topwisemp35p.release();

8. 处理权限

在某些设备上,播放音频可能需要特定的权限。确保在 Android 和 iOS 上处理相应的权限请求。

9. 错误处理

在实际使用中,可能会遇到各种错误,例如文件路径错误或设备不支持。建议在使用插件时添加错误处理:

try {
  Topwisemp35p.play(audioFilePath);
} catch (e) {
  print('Error playing audio: $e');
}

10. 平台特定的配置

在某些情况下,你可能需要在 AndroidManifest.xmlInfo.plist 中添加特定的配置,以确保插件正常工作。

示例代码

以下是一个简单的示例,展示了如何使用 topwisemp35p 插件播放音频:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: AudioPlayerScreen(),
    );
  }
}

class AudioPlayerScreen extends StatefulWidget {
  [@override](/user/override)
  _AudioPlayerScreenState createState() => _AudioPlayerScreenState();
}

class _AudioPlayerScreenState extends State<AudioPlayerScreen> {
  String audioFilePath = 'path/to/your/audio/file.mp3';

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

  [@override](/user/override)
  void dispose() {
    Topwisemp35p.release();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Audio Player'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: () {
                Topwisemp35p.play(audioFilePath);
              },
              child: Text('Play'),
            ),
            ElevatedButton(
              onPressed: () {
                Topwisemp35p.pause();
              },
              child: Text('Pause'),
            ),
            ElevatedButton(
              onPressed: () {
                Topwisemp35p.stop();
              },
              child: Text('Stop'),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部