14

我试图获取保存在手机中的消息 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 方法中检索。谢谢

4

2 回答 2

0

您将不得不解析 SMS PDU(原始 PDU 格式),因为在 android 应用层不存在用于检索用户数据标头的 API。我相信短消息标识符位于用户数据标头(八位字节 1)中。请参阅解析 SMS PDU的帖子。

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

希望这可以帮助。

于 2013-04-15T18:04:20.887 回答
-1

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

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

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

如果您想获得真正的低级并自己解析事物,则应该查看 CDMA 和 GSM 的特定实现SMSMessage(尽管这不是要明确的子类),它们当然是 android 内部的,不打算使用作为暴露的 API。用于解析 PDU 的 CDMA 实现是 at,...cdma.SMSMessage.parsePdu(byte[])而 GSM 实现是 at ...gsm.SMSMessage.parsePdu(byte[])。有关底层基类的参考,您应该看到SMSMessageBase.

于 2021-01-23T23:28:03.480 回答