2012年1月5日木曜日

【Android】電話帳からメールアドレスと名前を取得する

今作っているアプリで、電話帳から登録名とメールアドレスを取得し一覧を表示する必用がある。

そこで、実装を試す。そんなに難しくないとたかをくくっていた。

なんとか、取得ができたのでメモ。

まず、失敗例





String[] Projection = { Email.DISPLAY_NAME, Email.DATA };

Cursor managedQuery = getContentResolver().query(Email.CONTENT_URI,Projectionl, null, null, null);

while (managedQuery.moveToNext()) {
 builder.append(managedQuery.getString(managedQuery.
getColumnIndex(Email.DISPLAY_NAME))).append(",").
append(managedQuery.getString(managedQuery.getColumnIndex(Email.DATA1)));
}
Log.d(TAG, builder.toString());

これを実行すると、メールアドレスの取得は出来るのだが、DISPLAY_NAMEがひたすらnullになる。それじゃあ、困る。


そこで、そもそも本当に登録名も取得できるのかを確認。

Cursor managedQuery = getContentResolver().query(Email.CONTENT_URI,
 null, null, null, null);

StringBuilder builder = new StringBuilder();
while (managedQuery.moveToNext()) {
 for (int i = 0; i < managedQuery.getColumnCount(); i++) {
  builder.append(i).append("=").append(managedQuery.getString(i));
  builder.append(",");
 }
 builder.append(managedQuery.getString(1));
 builder.append("\n");
 }
Log.d(TAG, builder.toString());

一応 i = 31 || 33 || 57 || 59

の時に、登録名を取得できていることが確認できた。

次に

builder.append(" is ").append(managedQuery.getColumnName(i));

を挟んでみて、カラムの名前を取りに行くと

i = 31 がdisplay_name

i = 32 がdisplay_name_alt

i = 57 がsort_key_alt

i = 59 がsort_key

さて、データがあるのなら話は早い。失敗例を元に実装を行う。


String[] Projection = { "display_name", Email.DATA };

Cursor managedQuery = getContentResolver().query(Email.CONTENT_URI,
 Projection, null, null, null);

StringBuilder builder = new StringBuilder();
while (managedQuery.moveToNext()) {
 builder.append(managedQuery.getString(0));
 builder.append(managedQuery.getString(1));
 builder.append("\n");
}
Log.d(TAG, builder.toString());

これで、登録した名前とメールアドレスを取得することができた。長かったぜ・・・。

ちなみに、Email.DISPLAY_NAMEの値は公式リファレンスによると、Data4 となっているらしい。

2番目の方法で、データを全部取得した時Data4は確かにnullになっていた。確かに・・・ああ、なっていたさ・・・。

0 件のコメント:

コメントを投稿