Я хочу иметь приемник для чтения 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)
Но этот метод облегчает сообщение только с основными полями.Как я могу получить другие поля (как через провайдера) в этом случае?