Eclair以降で、連絡帳に含まれている全ての人の誕生日を取得したい。
べ、別に僕がやりたかったわけじゃないけど、人の誕生日が取れてもいいかな、と思って…!!
参考
コンタクトリストの取得方法(Android SDK2.0以降の方法) | mucchinのAndroid戦記
Kaotaro
Google グループ
ContactsContract.Data | Android Developers
ソース
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みたいな感じでした。