由于这是我们正在讨论的 AIDL 文件,因此可以安全地假设这是 Android 独有的功能。
为此,与任何其他特定于 Android 的 MethodChannel 实现一样,您需要创建 MethodCallHandler 和/或 StreamHandler(取决于您是想做流还是只做命令 -> 结果方法),注册它在 Main FlutterActivity 上,并通过 MethodChannels 从 dart 中调用它。
免责声明
- 以下代码未经测试,可能存在一些语法错误,如果您发现问题,请告诉我,我会解决。
- 为简洁起见,我已将所有内容合并到一个文件中,您可以根据需要将部分代码移动到单独的文件中。
创建 MethodCallHandler/StreamHandler
在您的 Flutter 应用程序的 android/app/src/main/com/some/path 文件夹中,创建一个新的 java 文件并实现 ServiceConnection、MethodChannel.MethodCallHandler 和/或 EventChannel.StreamHandler:
public class PrinterPlugin implements MethodChannel.MethodCallHandler, EventChannel.StreamHandler, ServiceConnection {
public static final CHANNEL = "com.some.path/printer";
public static final EVENT_CHANNEL = "com.some.path/printer-events";
private Context context;
private IPrinterService printerService = null; // where IPrinterService would be the AIDL's name
public EventChannel.EventSink eventSink = null;
public PrinterPlugin(Context context) {
this.context = context;
if (printerService == null) {
// these strings should be in your documentation or you can find these values from the package manager
Intent intent = new Intent("com.your.printer.service");
intent.setPackage("com.whatever.aidl");
context.bindService(intent, this, Context.BIND_AUTO_CREATE);
}
}
public void disconnect() {
context.unbindService(this);
}
// streamhandler implementation
@Override
public void onListen(Object arguments, EventChannel.EventSink events) {
this.eventSink = events;
}
@Override
public void onCancel(Object arguments) {
this.eventSink = null;
}
// /streamhandler implementation
// methodcallhandler implementation
@Override
public void onMethodCall(MethodCall call, MethodChannel.Result result) {
try {
switch (call.method) {
case "initialize": printerService.printerInit(); break;
case "print-text": printerService.printText(call.argument("data")); break;
// implement other aidl methods
}
} catch (RemoteException e) {
result.error("", ex.getMessage(), null);
}
}
// /methodcallhandler implementation
// serviceConnection implementation
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
printerService = IPrinterService .Stub.asInterface(service);
if (eventSink != null) {
eventSink.success("Printer Connected");
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
printerService = null;
if (eventSink != null) {
eventSink.success("Printer Disconnected");
}
}
// /serviceConnection implementation
}
将 PrinterPlugin 作为 MethodChannel 和 EventChannel 注册到 MainActivity
现在已经不碍事了,您需要在 MainActivity 的 configureFlutterEngine 方法上注册此插件:
public class MainActivity extends FlutterActivity {
private PrinterPlugin printerPlugin;
@Override
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
super.configureFlutterEngine(flutterEngine);
Context context = getContext();
printerPlugin = new PrinterPlugin(context);
new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), PrinterPlugin.CHANNEL)
.setMethodCallHandler(printerPlugin);
new EventChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), PrinterPlugin.EVENT_CHANNEL)
.setStreamHandler(printerPlugin);
}
@Override
protected void onDestroy() {
super.onDestroy();
this.printerPlugin.unbindService();
}
}
从 dart 中调用方法
现在您需要做的最后一件事是从 dart 中调用这些。
const MethodChannel _channel = MethodChannel('com.some.path/printer'); // should match the CHANNEL constant on the java side
const EventChannel _evntChannel = EventChannel('com.some.path/printer-events'); // should match the EVENT_CHANNEL constant on the java side
class PrinterPlugin {
static Stream<dynamic> _printerStream = _eventChannel.receiveBroadcastStream();
Stream<String> status$;
PrinterPlugin() {
status$ = _printerStream;
}
static Future printText(String data) async {
await _channel.invokeMethod('initialize');
await _channel.invokeMethod('print-text', 'Foo Bar');
}
}
嗯,那是很多代码 - 但我基本上就是这样做的。只是一个 MethodCallHandler 和一个 ServiceConnection 实现。
您也可以对这个实现发疯,例如实时打印进度,或获取流式打印机状态等。
让我知道它是否适合您的需求。