Delphi 10.1 BerlinのAndroidアプリケーションで通話履歴を取得するには

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;

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です