Delphi 10.1 BerlinのAndroidアプリケーションで通話履歴を取得するサンプルコードです。
サンプルコードを実行するには、権限を追加する必要があります。
メニューの「プロジェクト」→「オプション」→「使用する権限」→「通話履歴の読み取り」をチェックします。
すべての通話履歴を取得するサンプルコード
uses
Androidapi.Helpers,
Androidapi.JNI.GraphicsContentViewText,
Androidapi.JNI.Provider;
var
Cursor: JCursor;
Name: string;
begin
Cursor := TAndroidHelper.Activity.getContentResolver.query(
TJCallLog_Calls.JavaClass.CONTENT_URI,
nil,
nil,
nil,
nil);
if Cursor.moveToFirst then
begin
while True do
begin
Name := JStringToString
(Cursor.getString(Cursor.getColumnIndex(StringToJString('NAME'))));
Memo1.Lines.Add(Name);
if not Cursor.moveToNext then
Exit;
end;
end;
end;
期間を指定して取得するサンプルコード
ContentResolverのqueryメソッドは3番目の引数に条件を指定できます。
ここに日付を上限と下限を指定します。
DelphiのDateTimeToUnixやUnixToDateTimeの単位は秒ですが、Javaはミリ秒です。
そのため調整が必要になります。
‘NAME’や’DATE’は定数を使うべきかもしれません。
コードをシンプルにするため値を使用しています。
uses
System.DateUtils,
Androidapi.Helpers,
Androidapi.JNI.GraphicsContentViewText,
Androidapi.JNI.Provider;
var
Cursor: JCursor;
Name: string;
UnixDate: Int64;
Date: TDateTime;
Selection: string;
begin
// 2016年4月1日から2016年6月1日まで
Selection := Format(
'DATE>%d and DATE<%d',
[DateTimeToUnix(EncodeDate(2016, 4, 1)) * 1000,
DateTimeToUnix(EncodeDate(2016, 6, 1)) * 1000]);
// 3番目の引数で条件を指定する
Cursor := TAndroidHelper.Activity.getContentResolver.query(
TJCallLog_Calls.JavaClass.CONTENT_URI,
nil,
StringToJString(Selection),
nil,
nil);
if Cursor.moveToFirst then
begin
while True do
begin
Name := JStringToString
(Cursor.getString(Cursor.getColumnIndex(StringToJString('NAME'))));
UnixDate := Cursor.getLong
(Cursor.getColumnIndex(StringToJString('DATE')));
Date := UnixToDateTime(UnixDate div 1000);
Memo1.Lines.Add(Name + ' ' + FormatDateTime('yyyy/mm/dd hh:nn:ss', Date));
if not Cursor.moveToNext then
Exit;
end;
end;
end;