Для того чтобы получить доступ к списку вызовов необходимо воспользоваться контент-провайдером и получить доступ к таблице «CallLog.Calls». Код написан для API 10, т.е. будет работать на версиях Android от 2.3.3 и выше.
Upd (20.04.14). Проверил код на Delphi XE6 и добавил информацию о необходимых изменениях.
В этой таблице хранится информация обо всех вызовах. Для примера, я создал приложение, которое получает информацию обо всех вызовах. Информация включает в себя: Имя вызова (контакта), номер, тип вызова, дату вызова, длительность. О доступной информации, подробно можно почитать в документации http://developer.android.com/reference/android/provider/CallLog.Calls.html#constants.
Сортировка в таблице по умолчанию (столбец «DEFAULT_SORT_ORDER») производится по дате вызова.
О чём нам необходимо помнить:
- Номер вызова (столбец «NUMBER») может не быть в нашей телефонной книге, а значит, не будет имени (столбец «CACHED_NAME») для вызова. Пишем условие, проверяющее этот случай. Если имени нет, то выводим вместо него номер.
- Тип звонка (столбец «TYPE»), из таблицы возвращается как строка, но на самом деле там число, значит, не забываем перевести в Integer. Также пишем оператор выбора «case», чтобы перевести число в текстовое значение.
- Длительность разговора (столбец «DURATION»), тут значение возвращается в виде строки, но само значение является числом (INTEGER (long)), которое отображает длительность разговора в секундах. Т.е. нам нужно перевести секунды в минуты, желательно в формате «04:53».
- Дата вызова (столбец «DATE»), возвращается значение в виде строки, но само значение является числом (INTEGER (long)), которое отображает дату вызова в миллисекундах с начала эпохи. Опять же необходимо перевести это число в формат «31.03.2014 16:07». Не забываем, что время в миллисекундах и в Unix – системе («January 1, 1970» вместо «12:00 A.M. on December 30, 1899»), о функциях работы со временем и датами можно почитать в официальной документации http://docwiki.embarcadero.com/RADStudio/XE5/en/Date_and_Time_Support
Теперь напишем код (Delphi XE5 Update 2):
uses FMX.Helpers.Android, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.Provider, Androidapi.JNI.JavaTypes, System.DateUtils; procedure TForm1.Button1Click(Sender: TObject); var cursor: JCursor; CallTypeInt: Integer; CallDuration, CallDate: Int64; CallName, CallTypeStr: String; ListBoxItem: TListBoxItem; begin cursor := SharedActivity.getContentResolver.query( TJCallLog_Calls.JavaClass.CONTENT_URI, nil, nil, nil, nil); ListBox1.Clear; ListBox1.BeginUpdate; if (cursor.getCount > 0) then begin while (cursor.moveToNext) do begin CallName := JStringToString(cursor.getString( cursor.getColumnIndex(TJCallLog_Calls.JavaClass.CACHED_NAME))); if CallName = '' then begin CallName := JStringToString(cursor.getString( cursor.getColumnIndex(TJCallLog_Calls.JavaClass.NUMBER))); end; CallTypeInt := StrToInt(JStringToString(cursor.getString( cursor.getColumnIndex(TJCallLog_Calls.JavaClass.&TYPE)))); case CallTypeInt of 1: CallTypeStr := 'Входящие'; 2: CallTypeStr := 'Исходящие'; 3: CallTypeStr := 'Пропущенные'; else CallTypeStr := 'Отменено'; end; CallDuration := StrToInt64(JStringToString(cursor.getString( cursor.getColumnIndex(TJCallLog_Calls.JavaClass.DURATION)))); CallDate := StrToInt64(JStringToString(cursor.getString( cursor.getColumnIndex(TJCallLog_Calls.JavaClass.DATE)))); ListBoxItem := TListBoxItem.Create(ListBox1); ListBoxItem.ItemData.Text := CallTypeStr + ': ' + CallName; ListBoxItem.ItemData.Detail := DateTimeToStr(TTimeZone.Local.ToLocalTime( UnixToDateTime(CallDate div 1000))) + ' Длительность: ' + Format('%2.2d:%2.2d', [CallDuration div 60, CallDuration mod 60]); ListBox1.AddObject(ListBoxItem); Label1.Text := 'Всего: ' + IntToStr(ListBox1.Count); end; end; cursor.close; ListBox1.EndUpdate; end;
UPDATE (20.04.14):
Чтобы код заработал в Delphi XE6, необходимо:
в "uses" заменить модуль "Androidapi.JNI.JavaTypes" на "Androidapi.Helpers".
Архив обновлён (Добавил комментарий для Delphi XE6)!
Скриншоты:
Исходный код: Скачать с Google Drive
Спасибо за внимание.
p.s. Надеюсь, вам пригодится данный материал.
p.s.2. Если вы заметили ошибку, то сообщите мне.
p.s.2. Если вы заметили ошибку, то сообщите мне.