Eclair以降で、連絡帳に含まれている全ての人の誕生日を取得したい。

べ、別に僕がやりたかったわけじゃないけど、人の誕生日が取れてもいいかな、と思って…!!

ソース

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract.CommonDataKinds;
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.CommonDataKinds.Event;
import android.util.Log;

public class BirthdayActivity extends Activity {

	@Override
	public void onCreate(Bundle bundle) {
		super.onCreate(bundle);
		setContentView(R.layout.main);

		List<PersonalData> datas = getBirthdayData();

		for (PersonalData data : datas) {
			Log.d("Birthday", data.getDisplayName());
			Log.d("Birthday", data.getBirthDay());
		}
	}

	private List<PersonalData> getBirthdayData() {

		List<PersonalData> result = new ArrayList<PersonalData>();

		Uri uri = Contacts.CONTENT_URI;
		String[] projection = new String[] { Contacts._ID,
				Contacts.DISPLAY_NAME };
		String selection = null;
		String[] selectionArgs = null;
		String sortOrder = null;

		Cursor c1 = managedQuery(uri, projection, selection, selectionArgs,
				sortOrder);

		projection = new String[] { Event.START_DATE };
		selection = Data.CONTACT_ID + " = ? AND " + Data.MIMETYPE + " = ? AND "
				+ Event.TYPE + " = ?";

		while (c1.moveToNext()) {
			selectionArgs = new String[] { c1.getString(0),
					CommonDataKinds.Event.CONTENT_ITEM_TYPE,
					String.valueOf(Event.TYPE_BIRTHDAY) };

			Cursor c2 = managedQuery(Data.CONTENT_URI, projection, selection,
					selectionArgs, null);

			if (c2.moveToNext()) {
				PersonalData data = new PersonalData(c1.getString(1), c2
						.getString(0));
				result.add(data);
			}
		}

		return result;
	}

	public class PersonalData {
		private String displayName;
		private String birthDay;

		public PersonalData(String displayName, String birthDay) {
			this.displayName = displayName;
			this.birthDay = birthDay;
		}

		public String getDisplayName() {
			return displayName;
		}

		public void setDisplayName(String displayName) {
			this.displayName = displayName;
		}

		public String getBirthDay() {
			return birthDay;
		}

		public void setBirthDay(String birthDay) {
			this.birthDay = birthDay;
		}
	}
}

説明

見れば分かると思うのでざっくりとした説明だけ。
動いたコードから考えた説明なので、間違ってたらすんません。

Eclair以前
android.provider.Contacts.CONTENT_URI

Eclair以降
android.provider.ContactsContract.Contacts.CONTENT_URI

主テーブルと、色々な属性を持った子テーブル(Data.CONTENT_URI)に分かれてて、
Data.CONTACT_ID = Contacts._ID 的に検索すると主テーブルのキーと子テーブルのデータを突き合わせ出来て、あとはMIMETYPEでEventのデータだけ拾って、さらにTYPEでBIRTYDAYを拾うようにすると子テーブルの中から誕生日のデータが拾えるのでそれでおkみたいな感じでした。