Какие поля SMS действительны? - PullRequest
0 голосов
/ 25 сентября 2018

Я хочу иметь приемник для чтения SMS-сообщений, как только они приходят.Есть много примеров приемников, лежащих вокруг, и это не так много работы, чтобы создать один.Это выяснилось.

Еще одно требование - запросить у поставщика контента Android SMS.Я пишу что-то вроде этого для запроса SMS:

public static List<SMSMessage> getAllSMSMessages(@NonNull Context context){

        List<SMSMessage> smsMessageList = null;

        Cursor smsCursor = null;

        Uri contentUri;

        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
            contentUri = Telephony.Sms.CONTENT_URI;
        }
        else{
            contentUri = Uri.parse("content://sms");
        }

        try{
            smsCursor = context.getContentResolver().query(contentUri
                    , null, null, null,
                    "date DESC");

            if(smsCursor != null && smsCursor.moveToFirst()){

                smsMessageList = new ArrayList<SMSMessage>(smsCursor.getCount());

                // Prepare the column names
                String columnId, columnMessageType, columnAddress, columnMessageBody, columnMessageReadState,
                        columnMessageReceivedDateTime, columnMessageSentDateTime, columnMessageStatus;

                if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
                    columnId = Telephony.Sms._ID;
                    columnMessageType = Telephony.Sms.TYPE;
                    columnAddress = Telephony.Sms.ADDRESS;
                    columnMessageBody = Telephony.Sms.BODY;
                    columnMessageReadState = Telephony.Sms.READ;
                    columnMessageReceivedDateTime = Telephony.Sms.DATE;
                    columnMessageSentDateTime = Telephony.Sms.DATE_SENT;
                    columnMessageStatus = Telephony.Sms.STATUS;
                }
                else{
                    columnId = "_id";
                    columnMessageType = "type";
                    columnAddress = "address";
                    columnMessageBody = "body";
                    columnMessageReadState = "read";
                    columnMessageReceivedDateTime = "date";
                    columnMessageSentDateTime = "date_sent";
                    columnMessageStatus = "status";
                }

                do{
                    int id = Integer.parseInt(smsCursor.getString(smsCursor.getColumnIndex(columnId)));
                    Integer messageType = Integer.parseInt(smsCursor.getString(smsCursor.getColumnIndex(columnMessageType)));
                    String address = smsCursor.getString(smsCursor.getColumnIndex(columnAddress));
                    String body = smsCursor.getString(smsCursor.getColumnIndex(columnMessageBody));
                    String readState = smsCursor.getString(smsCursor.getColumnIndex(columnMessageReadState));
                    long receivedDateTime = Long.parseLong(smsCursor.getString(smsCursor
                            .getColumnIndex(columnMessageReceivedDateTime)));
                    long sentDateTime = Long.parseLong(smsCursor.getString(smsCursor
                            .getColumnIndex(columnMessageSentDateTime)));
                    String messageStatus = toAppDefinedMessageStatus(Integer.parseInt(smsCursor.getString(smsCursor.getColumnIndex(columnMessageStatus))));

                    SMSMessage message = new SMSMessage(Long.toString(System.currentTimeMillis()), id, toAppDefinedMessageType(messageType), address, body, readState,
                            receivedDateTime, sentDateTime, messageStatus);

                    smsMessageList.add(message);

                }while (smsCursor.moveToNext());
            }
        }finally {
            if(smsCursor != null){
                smsCursor.close();
            }
        }

        return smsMessageList;
    }

Этот метод возвращает все сообщения от поставщика успешно.Теперь, как вы можете видеть, я смоделировал SMS-сообщение с полями, как указано выше.Я хотел бы сохранить одно и то же моделирование, где бы я ни создавал сообщение - будь то сообщения, возвращаемые поставщиком контента, или сообщение, которое я получаю от получателя.

За исключением ... Я не могу построить все поля, которыеконтент-провайдер предоставляет при анализе сообщения через получателя.

Если вы решите выполнить поиск, существует метод для анализа сообщения из комплекта Intent:

https://developer.android.com/reference/android/telephony/SmsMessage.html#createFromPdu(byte[],%20java.lang.String)

Но этот метод облегчает сообщение только с основными полями.Как я могу получить другие поля (как через провайдера) в этом случае?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...