Ionic Android 从 javascript 向本机广播事件

Ionic Android broadcast event from javascript to native

我正在尝试通过广播插件将事件从 javascript(具体来说是 angular)发送到 android:https://github.com/bsorrentino/cordova-broadcaster

在 UI 中,我用一些数据触发了一个本地事件:

this.broadCaster
    .fireNativeEvent("com.service.print", { extras: { item: "test data" } })
    .then((result) => {
        console.log("broadcast sent:" + result);
    })
    .catch((error) => {
        console.log("Error sending broadcast:" + error);
    });

在 android 上,我在 AndroidManifest.xml 中注册了一个接收器:

<receiver android:name="io.ionic.starter.PrintReceiver">
    <intent-filter>
        <action android:name="com.service.print"></action>
    </intent-filter>
</receiver>

并添加了 PrintReceiver class 来处理 broadcast:

public class PrintReceiver extends BroadcastReceiver {

  @Override
  public void onReceive(Context context, Intent intent) {
    String data = intent.getExtras().getString("data");
    List<PrinterCommand> commands = new ArrayList<PrinterCommand>();

    // Add commands to be sent
    commands.add(
      new PrinterCommand(PrinterCommand.CommandType.TEXT, "Normal row 1\n")
    );
    Gson gson = new Gson();
    String json = gson.toJson(commands);
    System.out.println("Sending print broadcast: " + json);
    Intent printIntent = new Intent(MyPOSUtil.PRINT_BROADCAST);

    // Add the commands
    printIntent.putExtra("commands", json);

    // Send broadcast
     LocalBroadcastManager.getInstance(context).sendBroadcastSync(printIntent);
  }
}

当我尝试在 Android 设备上 运行 应用程序时,出现此错误:

2020-07-31 10:31:34.007 11308-11416/io.ionic.starter V/Capacitor/Plugin: To native (Cordova plugin): callbackId: broadcaster343151718, service: broadcaster, action: fireNativeEvent, actionArgs: ["com.service.print",{"extras":{"item":"test data"}},false]
2020-07-31 10:31:34.022 11308-11433/io.ionic.starter V/CDVBroadcaster: sendBroadcast isGlobal=false
2020-07-31 10:31:34.051 11308-11308/io.ionic.starter I/Capacitor/Console: File: http://localhost/auth-auth-module-es2015.js - Line 70 - Msg: Error sending broadcast:OK

注意:我尝试使用相同的插件接收来自 android 的广播并且有效。

这里可能是什么问题。

好的,最终我发现 brodcaster 插件没有任何问题,它实际上发送了正确的广播。

我了解到,从 Android 8 开始,您无法在 Manifest.xml 中注册您的接收器,而是使用基于上下文的注册。

Android 8+ manifest registration restrictions