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();
    }

}

これでSMSの本文と差出人番号を取得。しかし、Androidフォンのすべてのメッセージに一意の番号が存在することを知っているので、それを取得しました。ただし、onReceive メソッドでは取得できません。ありがとう

4

2 に答える 2

0

Android アプリケーション層にはユーザー データ ヘッダーを取得する API が存在しないため、SMS PDU を (生の PDU 形式で) 解析する必要があります。ショート メッセージ識別子はユーザー データ ヘッダー (オクテット 1) 内にあると思います。投稿SMS PDUの解析 を参照してください。

その投稿では、ユーザーの 1 人が、メッセージ パラメータを解析して抽出するために、「SMSLib」(APACHE ライセンスに基づく) という名前のフリーウェアについて言及しています。メッセージ ID は、メソッド getMessageId() - クラス org.smslib.Message のメソッドを使用して抽出できます。

お役に立てれば。

于 2013-04-15T18:04:20.887 に答える
-1

これがあなたの目的に十分かどうかはわかりませんが、このSMSMessage.getIndexOnICC()メソッドは、スマート カード/ICC によって割り当てられたの一意の識別子であるint1 から (おそらく まで) インデックス付けされた を返します。が ICC を介して処理されたのではなく、合成された場合にも -1 を返すことがあります。Integer.MAX_VALUESMSMessageSMSMessage

PDU を使用して合成する代わりに、独自のものをローリングする代わりに、API 呼び出しを使用して PDU を介して のTelephony.Sms.Intents#getMessagesFromIntent(Intent)リストを取得するために使用する必要があります。SMSMessageただし、これは API 19 で追加されたため、API のバージョンによってはサポートされていない場合があります。

独自のバージョンを作成したい場合は、現在のバージョン (執筆時点では API 30 ですが、マスターへのリンクであるため変更される可能性があります) のgetMessageFromIntent(Intent)ソース コードをここで参照して、 API (何らかの理由でそれを行いたい場合)。an を合成する適切な方法SMSMessageは、少なくともほとんどの場合、実際に行っている方法のようです。から取得した形式を実際に使用SMSMessage.createFromPdu(byte[], String)および指定する必要がありますIntent.getStringExtra("format")が、そうしないと、メッセージの形式によっては問題が発生する可能性があります (たとえば、マルチ SIM デバイスで両方の形式が見つかる場合があります)。

本当に低レベルのものを取得して自分で解析したい場合は、CDMA および GSM 固有の実装に目を向ける必要がありますSMSMessage(ただし、これは明らかにサブクラスではありません)。公開された API として。PDU を解析するための CDMA 実装は で...cdma.SMSMessage.parsePdu(byte[])、GSM 実装は...gsm.SMSMessage.parsePdu(byte[])です。基礎となる基本クラスへの参照については、 を参照してくださいSMSMessageBase

于 2021-01-23T23:28:03.480 に答える