Для того чтобы получить доступ к списку вызовов необходимо воспользоваться контент-провайдером и получить доступ к таблице «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. Если вы заметили ошибку, то сообщите мне.
