Androidプログラマへの道 〜 Moonlight 明日香 〜 - 通話ログを取得する
発信履歴や着信履歴などの通話ログを取得するには, コールログ(CallLog)クラスとコンテントリゾルバ(ContentResolver)クラスを利用する.

通話ログの取得

  • MainActivity.java
    • getContentResolverメソッドで, ContentResolverのインスタンスを取得する.
    • ContentResolver#queryメソッドで, 第1引数に"CallLog.Calls.CONTENT_URI"を指定して, 通話ログを取得する.
    • Cursor#getCountメソッドで, データベースにヒットした件数を取得する.
    • Cursor#getColumnIndexメソッドで, 項目を指定してデータを取得する.
    • Cursor#closeメソッドで, クローズする.

  取得できる主な情報
カラム名情報
CACHED_NAME名前
NUMBER電話番号
DATE日時
TYPEタイプ(発信, 着信, 不在着信)
DURATION通話時間
その他に取得できる情報については, Android Developerの以下を参照.
http://developer.android.com/reference/android/pro...
package com.moonlight_aska.android.calllog;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

import android.os.Bundle;
import android.provider.CallLog;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;

public class MainActivity extends Activity {
  ArrayAdapter<String> mAdapter = null;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
    // 通話ログの取得
    ContentResolver resolver = getContentResolver();
    Cursor cursor = resolver.query(
        CallLog.Calls.CONTENT_URI, // データの種類
        null, // 項目(null 全項目)
        null, // フィルタ条件(null フィルタなし)
        null, // フィルタ用パラメータ
        CallLog.Calls.DEFAULT_SORT_ORDER // ソート
      );
    Log.v("CALL", Arrays.toString(cursor.getColumnNames())); // 項目名一覧
    Log.v("CALL", "Num = " + cursor.getCount() ); // 取得件数
    if (cursor.moveToFirst()) {
      do {
        // タイムスタンプ
        Date date = new Date(cursor.getLong(cursor.getColumnIndex("DATE")));
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        // 名前
        String name = cursor.getString(cursor.getColumnIndex("NAME"));
        // 電話番号
        String number = cursor.getString(cursor.getColumnIndex("NUMBER"));
        // アダプタに追加
        mAdapter.add("日時:" + dateFormat.format(date)
          + "\n名前:" + name + "\n番号:" + number);
      } while (cursor.moveToNext());
    }
    cursor.close();
    ListView listView = (ListView)findViewById(R.id.listview);
    listView.setAdapter(mAdapter);
  }
}
  • AndroidManifest.xml
    • パーミッションを設定する.
   API Level 16以上 : "android.permission.READ_CALL_LOG"
   API Level 15以下 : "android.permission.READ_CONTACTS"
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.moonlight_aska.android.calllog"
  android:versionCode="1"
  android:versionName="1.0" >

  <uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="19" />
  <uses-permission android:name="android.permission.READ_CALL_LOG"/>

  <application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
      android:name="com.moonlight_aska.android.calllog.MainActivity"
      android:label="@string/app_name" >
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
  </application>
</manifest>
  • 動作例
SHARP SHL22 / Android 4.2.2