问题
我正在开发一个需要使用 Radar.io SDK 功能的应用程序,因此我决定创建一个插件,以便在项目完成后与 Flutter 社区分享插件。问题是,我无法在插件中接收事件。这对于插件非常重要,因为为了接收诸如地理位置触发器和其他后台事件等事件,该接收器需要接收实时信息。
我已经成功实现了他们在 Android 上 SDK 的每个功能(使用 Kotlin),可以在此处查看https://radar.io/documentation/sdk,但是当事件发生时,接收器没有被调用。我知道设备正在被跟踪,因为位置在 Radar.io 仪表板上更新,但是当各种事件发生时根本不执行接收器。
我尝试过的方法
以下是文档告诉您如何在清单中注册接收器的方法。
<receiver
android:name=".MyRadarReceiver"
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="io.radar.sdk.RECEIVED" />
</intent-filter>
</receiver>
这适用于标准应用程序,但是当我在清单中注册接收器时,应用程序不会查找接收器所在的插件目录。相反,它会查找应用程序的Android目录,并返回无法找到数据路径的错误。这会导致应用程序终止。
为了解决这个问题,我发现可以以编程方式设置接收器,所以我决定尝试一下。
在插件的主要Kotlin文件中,我编写了以下代码行,以在
registerWith
和onAttachedToEngine
中执行。我的理解是,这些基本上是onStart函数。registerWith
是为与旧设备兼容而保留的较旧函数。val myRadarReceiver = MyRadarReceiver()
val intentFilter = IntentFilter()
intentFilter.addAction("io.radar.sdk.RECEIVED")
ContextWrapper(this.context).registerReceiver(myRadarReceiver, intentFilter)
被引用为MyRadarReceiver()
的类是SDK中RadarReceiver
类的扩展,扩展了BroadcastReceiver
,这意味着这是我自己的广播接收器。以下是该类:
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
中的某个函数将被执行,但终端没有输出任何内容。没有错误,但也没有收到任何信息。这让我怀疑是否我设置了不正确的意图,或者接收器编写有误。我不知道是否有其他设置意图的方法,所以我决定像下面这样以更简单的形式重新编写MyRadarReceiver:
public class MyRadarReceiver: BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
println("works! Something was received")
}
}
不幸的是,控制台没有输出任何内容,因此我现在认为这与我的意图有关。
总结
我剩下的唯一解决方案是在应用程序中编写接收器,而不是在插件中编写。这可能有效,但我希望在完成后与Flutter社区分享此插件。雷达是一个非常强大的平台,将此插件带给Flutter社区可能会产生巨大的影响。
package
属性是什么? - Nitrodonpackage="agency.sparc.flutter_radar_io"
,但对于示例应用程序,则为package="agency.sparc.flutter_radar_io_example"
。 - Anthony SetteAttribute application@label value=(flutter_radar_io_example) from AndroidManifest.xml:16:9-49 is also present at [:flutter_radar_io] AndroidManifest.xml:9:9-41
- Anthony Sette