Получаем Список Sms-сообщений

  • Автор темы Автор темы Lomanu4
  • Дата начала Дата начала

Lomanu4

Команда форума
Администратор
Ofline
Что необходимо для чтения SMS.
  • Выдать права на чтение СМС-сообщений – «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» и на нём создаём кнопку «Назад»
structure.PNG

Далее в первый 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;
Какие поля можно получить:
%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA.PNG

Данный список лежит в официальной документации: https://developer.android.com/reference/android/provider/Telephony.TextBasedSmsColumns.html#top
AndroidScreen1.png
 
Назад
Сверху Снизу