Android接收短信意图:获取消息ID或线程ID

7
我已经注册了一个广播接收器来接收android.provider.Telephony.SMS_DELIVER Intent操作。我似乎能够获取新消息的正文和发送者电话号码。
然而,我无法获取此新消息的消息ID或线程ID。我发现的唯一方法是搜索匹配内容的消息和对话表。但这似乎有点混乱,我觉得应该有更好的方法。
附注: 我错过了一些SMS文档吗?因为许多SMS API似乎很少有文档记录。
1个回答

4
在短信中,不存在消息ID或线程ID。每个短信都是一个完全独立于所有其他短信的数据包。在Android中,有一个标准的SMS应用程序,它将短信存储在数据库中,并使用一些标准对话“串连”,但这些标准不包含在SMS消息本身中。然而,第三方也可以构建完全以不同方式管理消息的SMS应用程序。这很大程度上取决于管理SMS的具体应用程序的概念和实现方式。这也是为什么关于SMS系统没有太多文档的原因。在Android中可用的API非常低级且非常基础。其他应用程序在其之上构建。

有没有办法使用这个基本的Android应用程序/服务来确定它维护的表中的线程或消息ID是什么?除了尝试查询匹配的消息正文和参与者的表之外。 - Noah Huppert
没有可靠的方法。例如,您可以查询内容提供程序(SMS数据库可用作内容提供程序)并请求数据库中最高编号的ID,并假定这是最近收到的消息。然而,这是不可靠的:可能会连续接收到许多传入消息;此外,传入消息需要一些时间才能存储和可用,如果您查询得太早,您将看不到最新的消息。 - David Wasser
所以我尝试了SQL查询的想法,但你是对的(毫不意外),当你接收到意图时,Android表还没有被更新。有没有办法监听表格的变化?或者我有点运气不好? - Noah Huppert
2
我们过去已经做过这个。在收到传入的消息“Intent”后,您可以等待一定的时间(可能是500毫秒左右),然后检查短信数据库。您可能需要调整延迟时间以使其正确,但这应该会让您更接近目标。由于您在“BroadcastReceiver”中,因此无法在那里等待。您需要启动另一个“Thread”或将“Runnable”发布到“Handler”以执行此操作。 - David Wasser
只是好奇,你们最终是如何处理这个新消息的?我目前的想法是仅显示一个通知,其中包含来自意图的数据,并且该通知将指向带有特定标志的活动,希望此时应用程序能够查询数据库并找出消息的详细信息。 - Noah Huppert
我们的解决方案相当复杂,但我们处理的是针对应用程序而非人类的短信。我无法在这方面给你任何帮助。 - David Wasser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接