ContentProviderで通話履歴を取得する


今回はAndroid端末の通話履歴を取得する方法を説明します。

  • 発信履歴
  • 着信履歴
  • 不在着信履歴

これらの情報はContentProviderを用いて取得します。ContentProviderは複数のアプリケーションでデータを共有するための仕組みで、詳細は以下の記事を参考にしてください。

履歴ではなく着信のイベントを取得したい場合は以下の記事も参考にしてください。

それでは続きへどうぞ

URIとパーミッション

ContentProviderからデータを取得するにはURIを指定することになりますが、通話履歴を取得するには

CallLog.Calls.CONTENT_URI

を指定します。

また通話履歴を取得するにはパーミッションの設定が必要なのでAndroidManifest.xmlに忘れずに以下の記述を追加します。

<uses-permission android:name=”android.permission.READ_CONTACTS”/>

取得出来る情報

取得できる主なものとして以下のものがあります。
情報 カラム名
電話番号 NUMBER
名前 CACHED_NAME
日付 DATE
種別(発信、着信、不在着信) TYPE

電話帳に登録されていればCACHED_NAMEで名前を取得することができます。登録されていない番号の場合はnullが入っています。

種別(TYPE)は以下の値が入っています。

  • INCOMING_TYPE – 1:着信
  • OUTGOING_TYPE – 2:発信
  • OUTGOING_TYPE – 3:不在着信

他にも通話時間など取得できる情報があるので詳細はAndroidDeveloperを参照してください。

http://developer.android.com/intl/ja/reference/android/provider/CallLog.Calls.html

サンプルソース

サンプルでは日付、電話番号、名前、種別をログに出力します。
ContentResolver contentResolver = getContentResolver();

// ソートする条件
String order = CallLog.Calls.DEFAULT_SORT_ORDER;

Cursor cursor = contentResolver.query(
 CallLog.Calls.CONTENT_URI,
 null,
 null,
 null,
 order
);

if (cursor.moveToFirst()) {
 do {
 String number = cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER));
 String cachedName = cursor.getString(cursor.getColumnIndex(CallLog.Calls.CACHED_NAME));
 String type = cursor.getString(cursor.getColumnIndex(CallLog.Calls.TYPE));
 Date date = new Date(cursor.getLong(cursor.getColumnIndex(CallLog.Calls.DATE)));

 Log.d(TAG, "DATE : " + date);
 Log.d(TAG, "NUMBER : " + number);
 Log.d(TAG, "CACHED_NAME : " + cachedName);
 Log.d(TAG, "TYPE : " + type);
 } while (cursor.moveToNext());
}

One Comment