微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android 通过蓝牙捕获和发送通知

如何解决Android 通过蓝牙捕获和发送通知

我有两个安卓设备。我开发了两个代码库。一个是发送方代码库,另一个是接收方。这两个都是通过蓝牙套接字连接的,我可以在它们之间发送简单的字符串。

在发件人设备上,我实现了一个 NotificationListenerService 来捕获来自该设备的通知。我为每个通知获取一个 StatusBarNotification 类型的对象。根据文档,此对象实现 Parcelable 接口。

为了传输这个对象,我尝试过使用GSON,以及使用Parcel对象来编组和发送数据。这不起作用,所以我不再担心发送部分,并尝试在同一台设备上查看这是否可以正确编组和解组。

这是两者的 Kotlin 代码

/*
 * Using Gson for serialization.
 * 
 * Parts of the object e.g. deserializedobject.notification are missing
 */
val serializedString = Gson().toJson(sbn)
val deserializedobject = Gson().fromJson<StatusBarNotification>(serializedString,StatusBarNotification::class.java)

/*
 * Using Parcel for serialization.
 *
 * Throws this error,* Caused by: java.lang.RuntimeException: Tried to marshall a Parcel that contained Binder objects.
 */
val parcel = Parcel.obtain()
parcel.writeValue(sbn)
val bytes = parcel.marshall()

val p2 = Parcel.obtain()
p2.unmarshall(bytes,bytes.size)
val result = p2.readValue(StatusBarNotification::class.java.classLoader) as StatusBarNotification

任何方向将不胜感激。

更新 1

我尝试创建自定义数据类对象。序列化和反序列化在蓝牙上工作得非常好,我正在第二个设备上获取数据。但是我已经缩小了范围,我的问题仍然是 StatusBarNotification 对象不能很好地与序列化配合使用。

val serializedCode = Gson().toJson(statusBarNotification) 在调试器中给出 {"id":1815187780,"pkg":"org.telegram.messenger","uid":10260}

任何线索将不胜感激。

更新 2

如果有任何官方方法可以通过 Android 实现通知回复,也将不胜感激。

解决方法

即使正确反序列化,状态栏通知对象也不一定代表其他设备上有意义的任何内容。这是因为它包含上下文信息,例如在另一台设备上不同的用户和进程 ID。

编辑:Parcel 序列化失败的原因是,正如错误消息所暗示的那样,有一个无法序列化(到字节数组中)的 Binder 对象。由于同样的原因,json 序列化可能会失败。并非所有资源/对象都可以序列化,或者序列化有意义。可能有一种方法可以通过它的 ID 检索 Notification 对象,在这种情况下,只需保存它就足够了。

您可以做的是仅将通知的基本信息作为字符串发送到第二个设备,在第二个设备上创建用户可以回答的新通知,将答案作为字符串发送回第一个设备,尝试使用该答案作为原始状态栏通知的回复。

一般来说,这在智能手表和 Chromebook 上是可能的。也许看看它是如何在 WearOS 中完成的会有所帮助

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。