Java 如何在颤振中实现.aidl文件

Java 如何在颤振中实现.aidl文件,java,android,flutter,dart,printers,Java,Android,Flutter,Dart,Printers,我正在尝试使用颤振与SunMi移动打印机进行通信。我想使用AIDL调用打印机作为与打印机通信的一种方式,但我不知道如何以及在何处将AIDL文件放置在Flatter中,或者在我的情况下是否可以使用Flatter。我需要知道是否可以使用打印机的AIDL与打印机通信。我选择在我的应用程序中使用flatter或androidstudio和java 问题来源: 我找不到正确的答案,所以把问题贴在这里。因为这是我们正在讨论的一个AIDL文件,所以可以安全地假设这是一个Android独有的功能 要做到这一点,

我正在尝试使用颤振与SunMi移动打印机进行通信。我想使用AIDL调用打印机作为与打印机通信的一种方式,但我不知道如何以及在何处将AIDL文件放置在Flatter中,或者在我的情况下是否可以使用Flatter。我需要知道是否可以使用打印机的AIDL与打印机通信。我选择在我的应用程序中使用flatter或androidstudio和java

问题来源:


我找不到正确的答案,所以把问题贴在这里。

因为这是我们正在讨论的一个AIDL文件,所以可以安全地假设这是一个Android独有的功能

要做到这一点,就像任何其他特定于Android的
MethodChannel
实现一样,您需要创建一个MethodCallHandler和/或StreamHandler(取决于您是想执行streams还是仅仅是一个command->result方法),在主活动中注册它,并通过MethodChannel从dart调用它

免责声明

  • 下面的代码未经测试,可能有一些语法错误,如果您发现问题,请告诉我,我将解决这些问题
  • 为了简洁起见,我将所有内容合并到一个文件中,您可以根据需要将代码的某些部分移动到单独的文件中
创建MethodCallHandler/StreamHandler

在Flatter应用程序的
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调用它

免责声明

  • 下面的代码未经测试,可能有一些语法错误,如果您发现问题,请告诉我,我将解决这些问题
  • 为了简洁起见,我将所有内容合并到一个文件中,您可以根据需要将代码的某些部分移动到单独的文件中
创建MethodCallHandler/StreamHandler

在Flatter应用程序的
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部分就可以了