Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

Как перехватить СМС состоящее из 2 или 3 СМС из приложения для андроид

#android #java


Мой ресивер, он отлично работает когда приходят короткие смс, но при больших, перехватывает
кусками.
@Override
    public void onReceive(Context context, Intent intent) {
        Log.d(LOG_TAG, "onReceive()");
        Bundle bundle = intent.getExtras();

        SmsMessage[] msgs = null;
        SmsMessage[] phonenum = null;//

        if (bundle != null) {
            // ---retrieve the SMS message received---
            Object[] pdus = (Object[]) bundle.get("pdus");

            msgs = new SmsMessage[pdus.length];
            for (int i = 0; i < msgs.length; i++) {
                msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
                body += msgs[i].getMessageBody().toString();
            }

            // ---retrieve the SMS senders number ---
            phonenum = new SmsMessage[pdus.length];
            for (int i = 0; i < phonenum.length; i++) {
                phonenum[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
                PhoneNUMBER += phonenum[i].getOriginatingAddress();
            }

Получается так, что если приходит большое сообщение, состоящее из 2 или 3 смс, то
он его полностью не берет, а помещает в переменную body, только первую часть, а остальные
вообще не обрабатывает. Получается пользователь видит первое СМС, цельной картины не
видит, а остальные смс приходят обычным путем, через уведомление. 
       Так вот хотел узнать как перехватывать такие сообщения?    


Ответы

Ответ 1



Держи кусочек код для перехвата мультипартных смсок. Возвращает Map: private Map retrieveMessages(Intent intent) { Map msg = null; SmsMessage[] msgs = null; Bundle bundle = intent.getExtras(); if (bundle != null && bundle.containsKey("pdus")) { Object[] pdus = (Object[]) bundle.get("pdus"); if (pdus != null) { int nbrOfpdus = pdus.length; msg = new HashMap(nbrOfpdus); msgs = new SmsMessage[nbrOfpdus]; // There can be multiple SMS from multiple senders, there can be a maximum of nbrOfpdus different senders // However, send long SMS of same sender in one message for (int i = 0; i < nbrOfpdus; i++) { msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); String originatinAddress = msgs[i].getOriginatingAddress(); // Check if index with number exists if (!msg.containsKey(originatinAddress)) { // Index with number doesn't exist // Save string into associative array with sender number as index msg.put(msgs[i].getOriginatingAddress(), msgs[i].getMessageBody()); } else { // Number has been there, add content but consider that // msg.get(originatinAddress) already contains sms:sndrNbr:previousparts of SMS, // so just add the part of the current PDU String previousparts = msg.get(originatinAddress); String msgString = previousparts + msgs[i].getMessageBody(); msg.put(originatinAddress, msgString); } } } } return msg; } Update Вызов: Map msgs = retrieveMessages(intent); for (String address : msgs.keySet()) String msg = msgs.get(address); //сообщение от адресата

Ответ 2



Попробуй так String message; ... //---retrieve the SMS message received--- Object[] pdus = (Object[]) bundle.get("pdus"); SmsMessage[] messages=new SmsMessage[pdus.length]; for(int i=0;i

Комментариев нет:

Отправить комментарий