Ofline
Что необходимо для чтения SMS.
По первому пункту всё вроде понятно без объяснения, поэтому рассмотрим второй пункт.
Как я уже говорил, все SMS-сообщения, созданные и отправленные на мобильном устройстве, а также полученные от других абонентов, сохраняются в локальной базе SMS-сообщений. Эти сообщения, в зависимости от их типа, распределены по определенным каталогам, имеющим стандартные названия и URI.
Вот полный список каталогов SMS-сообщений и URI для каждого каталога SMS:
Далее в первый ListBox добавляем 9 ListBoxItem'ов, по одному на каждый каталог SMS-сообщений. Я добавил их в дизайн-тайме. Пишем одну процедуру для всех ListBoxItem'ов, обрабатывающую выбранный каталог.
Код процедуры:
Какие поля можно получить:
Данный список лежит в официальной документации: https://developer.android.com/reference/android/provider/Telephony.TextBasedSmsColumns.html#top
- Выдать права на чтение СМС-сообщений – «Uses-Permission: Read SMS := true»
- Т.к. контент-провайдера нет, нужно знать, где хранятся сообщения (этот пункт рассмотрен ниже)
- Написать код 🙂
По первому пункту всё вроде понятно без объяснения, поэтому рассмотрим второй пункт.
Как я уже говорил, все SMS-сообщения, созданные и отправленные на мобильном устройстве, а также полученные от других абонентов, сохраняются в локальной базе SMS-сообщений. Эти сообщения, в зависимости от их типа, распределены по определенным каталогам, имеющим стандартные названия и URI.
Вот полный список каталогов SMS-сообщений и URI для каждого каталога SMS:
- Все: «content://sms»
- Входящие: «content://sms/inbox»
- Отправленные: «content://sms/sent»
- Черновики: «content://sms/draft»
- Исходящие: «content://sms/outbox»
- Неотправленные: «content://sms/failed»
- Находящиеся в очереди: «content://sms/queued»
- Недоставленные: «content://sms/undelivered»
- Разговоры: «content://sms/conversations»
- Один TTabControl – 2 вкладки (список каталогов и список сообщений из выбранного каталога)
- Два TListBox'а – по одному на каждой вкладке TTabControl'а.
- На вторую вкладку помещаем «TToolBar» и на нём создаём кнопку «Назад»
Далее в первый ListBox добавляем 9 ListBoxItem'ов, по одному на каждый каталог SMS-сообщений. Я добавил их в дизайн-тайме. Пишем одну процедуру для всех ListBoxItem'ов, обрабатывающую выбранный каталог.
Код процедуры:
Код:
uses
Androidapi.JNI.GraphicsContentViewText, FMX.Helpers.Android, Androidapi.Helpers;
procedure TForm1.ListBoxItemsClick(Sender: TObject);
var
cursor: JCursor;
catalog, SMSListBoxItem: TListBoxItem;
begin
catalog := TListBoxItem(Sender);
ListBox2.Clear;
ListBox2.BeginUpdate;
try
cursor := SharedActivity.getContentResolver.query(
StrToJURI(catalog.ItemData.Detail),
nil,
nil,
nil,
nil);
if(cursor.getCount > 0) then
begin
while (cursor.moveToNext) do
begin
SMSListBoxItem := TListBoxItem.Create(ListBox2);
SMSListBoxItem.ItemData.Text := JStringToString(cursor.getString(
cursor.getColumnIndex(StringToJString('ADDRESS'))));
ListBox2.AddObject(SMSListBoxItem);
end;
end;
finally
cursor.close;
ListBox2.EndUpdate;
end;
TabControl1.ActiveTab := TabItem2;
end;
Данный список лежит в официальной документации: https://developer.android.com/reference/android/provider/Telephony.TextBasedSmsColumns.html#top