Java 如何在颤振中实现.aidl文件
我正在尝试使用颤振与SunMi移动打印机进行通信。我想使用AIDL调用打印机作为与打印机通信的一种方式,但我不知道如何以及在何处将AIDL文件放置在Flatter中,或者在我的情况下是否可以使用Flatter。我需要知道是否可以使用打印机的AIDL与打印机通信。我选择在我的应用程序中使用flatter或androidstudio和java 问题来源:Java 如何在颤振中实现.aidl文件,java,android,flutter,dart,printers,Java,Android,Flutter,Dart,Printers,我正在尝试使用颤振与SunMi移动打印机进行通信。我想使用AIDL调用打印机作为与打印机通信的一种方式,但我不知道如何以及在何处将AIDL文件放置在Flatter中,或者在我的情况下是否可以使用Flatter。我需要知道是否可以使用打印机的AIDL与打印机通信。我选择在我的应用程序中使用flatter或androidstudio和java 问题来源: 我找不到正确的答案,所以把问题贴在这里。因为这是我们正在讨论的一个AIDL文件,所以可以安全地假设这是一个Android独有的功能 要做到这一点,
我找不到正确的答案,所以把问题贴在这里。因为这是我们正在讨论的一个AIDL文件,所以可以安全地假设这是一个Android独有的功能 要做到这一点,就像任何其他特定于Android的
MethodChannel
实现一样,您需要创建一个MethodCallHandler和/或StreamHandler(取决于您是想执行streams还是仅仅是一个command->result方法),在主活动中注册它,并通过MethodChannel从dart调用它
免责声明
- 下面的代码未经测试,可能有一些语法错误,如果您发现问题,请告诉我,我将解决这些问题
- 为了简洁起见,我将所有内容合并到一个文件中,您可以根据需要将代码的某些部分移动到单独的文件中
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
的configureFlatterEngine
方法上注册此插件:
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');
}
}
const MethodChannel _channel=MethodChannel('com.some.path/printer');//应该匹配java端的通道常量
const EventChannel _evntChannel=EventChannel('com.some.path/printer events');//应该匹配java端的事件\通道常量
类PrinterPlugin{
静态流_printerStream=_eventChannel.receiveBroadcastStream();
流状态$;
PrinterPlugin(){
状态$=\u printerStream;
}
静态未来打印文本(字符串数据)异步{
wait _channel.invokeMethod('initialize');
wait _channel.invokeMethod('print-text','Foo-Bar');
}
}
嗯,那是很多代码,但基本上我就是这么做的。只有一个带有ServiceConnection
实现的MethodCallHandler
您也可以疯狂地使用此实现,例如实时打印进度,或获取流式打印机状态等
让我知道它是否适合您的需要。因为这是我们正在讨论的一个AIDL文件,所以可以安全地假设这是一个仅适用于Android的功能 要做到这一点,就像任何其他特定于Android的
MethodChannel
实现一样,您需要创建一个MethodCallHandler和/或StreamHandler(取决于您是想执行streams还是仅仅是一个command->result方法),在主活动中注册它,并通过MethodChannel从dart调用它
免责声明
- 下面的代码未经测试,可能有一些语法错误,如果您发现问题,请告诉我,我将解决这些问题
- 为了简洁起见,我将所有内容合并到一个文件中,您可以根据需要将代码的某些部分移动到单独的文件中
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
的configureFlatterEngine
方法上注册此插件:
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');
}
}
const MethodChannel _channel=MethodChannel('com.some.path/printer');//应该匹配java端的通道常量
const EventChannel _evntChannel=EventChannel('com.some.path/printer events');//应该匹配java端的事件\通道常量
类PrinterPlugin{
静态流_printerStream=_eventChannel.receiveBroadcastStream();
流状态$;
PrinterPlugin(){
状态$=\u printerStream;
}
静态未来打印文本(字符串数据)异步{
wait _channel.invokeMethod('initialize');
wait _channel.invokeMethod('print-text','Foo-Bar');
}
}
嗯,那是很多代码,但基本上我就是这么做的。只有一个带有ServiceConnection
实现的MethodCallHandler
您也可以疯狂地使用此实现,例如实时打印进度,或获取流式打印机状态等
让我知道它是否适合您的需要。我不知道您是否仍然需要它,但我已经这样做了,这确实是可能的,好消息是它非常简单。您只需编写绑定到aidl的android部分。如果您仍然需要,我可以稍后为您以及最终可能找到此问题的人提供一些代码的答案。我现在离我的电脑还远着呢。@arvil那太好了。我不知道你是否还需要它,但我已经做到了,这确实是可能的,好消息是这很容易。你只需要写一个android部分就可以了