作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题
我正在构建一个需要 Radar.io SDK 的一些功能的应用程序,因此我决定创建插件,以便在这个项目结束后我可以与 Flutter 社区的其他人共享该插件。问题是,我无法在此插件中接收事件。这对于插件很重要,因为为了接收诸如地理位置触发器和其他背景事件之类的事件,该接收器需要接收实时信息。
我已经成功实现了他们的 SDK for Android(使用 Kotlin)中的每一个功能,在这里看到 https://radar.io/documentation/sdk ,但是,当事件发生时,接收器不会被调用。我知道设备正在被跟踪,因为在 Radar.io 仪表板中更新了位置,但是,当发生各种事件时,接收器根本不会执行。
我试过的
以下是文档告诉您在 list 中注册接收器的方式。
<receiver
android:name=".MyRadarReceiver"
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="io.radar.sdk.RECEIVED" />
</intent-filter>
</receiver>
这适用于标准应用程序,但是,当我在 list 中注册接收器时,应用程序不会在接收器所在的插件目录中查找。相反,它在应用程序 android 目录中查找并返回找不到数据路径的错误。这会导致应用程序终止。
registerWith
中执行和
onAttachedToEngine
.据我了解,这些基本上是 onStart 函数。
registerWith
是为了与旧设备兼容而保留的旧功能。
val myRadarReceiver = MyRadarReceiver()
val intentFilter = IntentFilter()
intentFilter.addAction("io.radar.sdk.RECEIVED")
ContextWrapper(this.context).registerReceiver(myRadarReceiver, intentFilter)
引用为
MyRadarReceiver()
的类是
RadarReceiver
的扩展SDK 中扩展
BroadcastReceiver
的类这意味着这是我的广播接收器。这是类(class):
public class MyRadarReceiver: RadarReceiver() {
override fun onEventsReceived(context: Context, events: Array<RadarEvent>, user: RadarUser) {
println("test: " + "an event was received")
}
override fun onLocationUpdated(context: Context, location: Location, user: RadarUser) {
println("test: " + "location was updated")
}
override fun onClientLocationUpdated(context: Context, location: Location, stopped: Boolean, source: Radar.RadarLocationSource) {
println("test: " + "client location updated")
}
override fun onError(context: Context, status: Radar.RadarStatus) {
println("test: " + status)
}
override fun onLog(context: Context, message: String) {
println("test: " + message)
}
}
当我在模拟设备上开始后台跟踪时,我期望
MyRadarReceiver
中的功能之一执行,但没有打印到终端。没有错误,但没有收到任何内容。这让我想知道我是否错误地设置了 Intent ,或者接收器是否写得不正确。我不知道设置 Intent 的另一种方法,所以我决定以更简单的形式重写 MyRadarReceiver,如下所示:
public class MyRadarReceiver: BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
println("works! Something was received")
}
}
不幸的是,控制台上没有打印任何东西,所以我现在相信这与我的 Intent 有关。
最佳答案
解决方案
在看到 Nitrodon 的评论后,我对这个问题有了不同的看法,并找到了解决方案。我不确定为什么程序化接收器初始化不起作用,但是,这是我在 中输入的内容。插件的安卓 list 。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.youorganization.yourproject">
<application
android:name="io.flutter.app.FlutterApplication">
<receiver
android:name=".MyRadarReceiver"
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="io.radar.sdk.RECEIVED" />
</intent-filter>
</receiver>
</application>
</manifest>
您不能在应用程序标签中添加 android 标签或其他任何内容,否则会因与应用程序的 Android Manifest 冲突而引发错误。出于这个原因,您只需在简单的应用程序标签中声明接收者,这些标签只包含
io.flutter.app.FlutterApplication
的名称。 .我希望这对其他人有帮助!如果有人有什么要补充的,请做,但它终于奏效了!
关于android - 如何在 flutter 插件中使用接收器(BroadcastReceiver)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64052156/
我是一名优秀的程序员,十分优秀!