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 中注册您的接收器,而是使用基于上下文的注册。
我正在尝试通过广播插件将事件从 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 中注册您的接收器,而是使用基于上下文的注册。