从onReceive android获取消息线程id或_id

时间:2013-03-31 12:49:36

标签: android sms

我试图获取保存在手机中的消息ID。 但我没能得到它。 我现有的代码在这里

@Override
public void onReceive(Context context, Intent intent) {
    String address = "";
    String message = "";
    String msg_id="";
    Bundle extras = intent.getExtras();
    if (extras != null) {
        Object[] smsExtra = (Object[]) extras.get("pdus");

        for (int i = 0; i < smsExtra.length; i++) {
            SmsMessage sms = SmsMessage.createFromPdu((byte[]) smsExtra[i]);
            message += sms.getMessageBody();
            address = sms.getOriginatingAddress();
        }
        sms = new Sms(msg_id,message, address);
        UploadSms up = new UploadSms();
        up.start();
        Toast.makeText(context,
                "SMS Received>>" + message + "From >>" + address,
                Toast.LENGTH_LONG).show();
    }

}

通过这个我得到短信的身体和发件人号码。 但我知道android手机中的每条消息都有一个唯一的号码,我检索了它。 但无法在onReceive方法中检索。 感谢

2 个答案:

答案 0 :(得分:0)

您必须解析SMS PDU(以原始PDU格式),因为在Android应用程序层,不存在用于检索用户数据头的API。我相信短消息标识符位于用户数据标题(八位位组1)内。请参阅帖子Parsing SMS PDU

在该帖子中,其中一个用户提到名为“SMSLib”(在APACHE许可证下)的免费软件,以便解析和提取消息参数。可以使用方法getMessageId() - 类org.smslib.Message中的方法提取消息ID。

希望这会有所帮助。

答案 1 :(得分:-1)

我不确定这是否满足您的目的,但 SMSMessage.getIndexOnICC() 方法返回一个 int,索引从 1(大概是 Integer.MAX_VALUE)开始,它是SMSMessage 由智能卡/ICC 分配。如果 SMSMessage 被合成而不是通过 ICC 处理,它也可以返回 -1。

您可能应该使用 Telephony.Sms.Intents#getMessagesFromIntent(Intent) 通过 API 调用通过 PDU 获取 SMSMessage 列表,而不是使用 PDU 进行合成,而不是使用您自己的。但是,这是在 API 19 中添加的,因此可能不受支持,具体取决于您的 API 版本。

如果您想推出自己的版本,可以查看 getMessageFromIntent(Intent) 源代码的当前版本(在撰写本文时为 API 30,但链接指向主版本,因此可能会更改){{3 }} 以了解如何在不使用 API 的情况下做事(如果您出于某种原因想要这样做)。似乎合成 SMSMessage 的正确方法实际上是您这样做的方式,至少在大多数情况下是这样。虽然您确实应该使用 SMSMessage.createFromPdu(byte[], String) 并指定您从 Intent.getStringExtra("format") 获得的格式,否则您可能会遇到取决于消息格式的问题(例如,您可能会在多卡上找到这两种格式设备)。

如果你想获得真正的底层并自己解析,你应该查看 SMSMessage 的 CDMA 和 GSM 特定实现(尽管这不是一个需要清楚的子类),当然android 内部,不打算用作公开的 API。用于解析 PDU 的 CDMA 实现位于 here,而 GSM 实现位于 ...cdma.SMSMessage.parsePdu(byte[])。有关底层基类的参考,您应该看到 ...gsm.SMSMessage.parsePdu(byte[])