グループ名も同時に読み込む
CommonDataKinds.GroupMembership と、ContactsContract.Data.CONTENT_URI
、CommonDataKinds.Email.CONTENT_URI
で、情報を取得、CommonDataKinds.GroupMembership.GROUP_ROW_ID
を取得しても、ContactsContract.Groups.CONTENT_URI
との結合がうまくいかない。
CursorJoiner は、文字列比較なので、GROUP_ROW_ID での結合が失敗してしまう。
諦めて、ContactsContract.Groups.CONTENT_URI だけでグループ名だけは、先に取得して、
ContactsContract.Data.CONTENT_URI で全部読みながら結合していくしかないみたいなので、
原始的なロジックになってもやってみる。
・Contact_ID でソートをすること。
・MIMETYPEを判定して、名前情報なのか、Emailなのか、GroupMembership の取得なのかを判定する。
public abstract class AllReadBook{
protected abstract void onRead(int contactId, String displayName, String familyName, String givenName
, String phoneticName, String phoneticFamilyName, String phonticeGivenName, boolean starred
, String emails, int groupIds, String titles);
public void scan(Context context){
// Group 読み出し
HashMap<Integer,String> titleMap = new HashMap<Integer,String>();
Cursor curgrp = context.getContentResolver().query(ContactsContract.Groups.CONTENT_URI
, new String{ BaseColumns._ID, ContactsContract.Groups.TITLE, ContactsContract.Groups.GROUP_VISIBLE, ContactsContract.Groups.DELETED }
, ContactsContract.Groups.GROUP_VISIBLE +"==1 AND " + ContactsContract.Groups.DELETED + "==0", null
, null);
if (curgrp.moveToFirst()){
do{
titleMap.put(curgrp.getInt(0), curgrp.getString(1));
}while(curgrp.moveToNext());
}
curgrp.close();
// 読込み保持用
String displayName = null;
String email = null;
Integer groupRowId = null;
String familyName = null;
String givenName = null;
String phoneticName = null;
String phoneticFamilyName = null;
String phoneticGivenName = null;
boolean starred = false;
List<String> mailList = new ArrayList<String>();
List<Integer> groupIdList = new ArrayList<Integer>();
List<String> groupNameList = new ArrayList<String>();
// 全て読込み
Uri uri = ContactsContract.Data.CONTENT_URI;
String projection = { ContactsContract.Data.CONTACT_ID
, ContactsContract.Data.MIMETYPE
, ContactsContract.Data.DATA1
, CommonDataKinds.StructuredName.FAMILY_NAME
, CommonDataKinds.StructuredName.GIVEN_NAME
, CommonDataKinds.StructuredName.PHONETIC_NAME
, CommonDataKinds.StructuredName.PHONETIC_FAMILY_NAME
, CommonDataKinds.StructuredName.PHONETIC_GIVEN_NAME
, ContactsContract.RawContacts.STARRED };
String selection = ContactsContract.Data.MIMETYPE + " =? OR " + ContactsContract.Data.MIMETYPE
+ " =? OR "+ ContactsContract.Data.MIMETYPE + " =? ";
String selectionArgs = { StructuredName.CONTENT_ITEM_TYPE
, CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE
, CommonDataKinds.Email.CONTENT_ITEM_TYPE
};
String sortOrder = RawContacts.CONTACT_ID + " ASC";
Cursor cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);
if (cursor.moveToFirst()){
Integer id = cursor.getInt(0);
String mimetype = cursor.getString(1);
if (StructuredName.CONTENT_ITEM_TYPE.equals(mimetype)){
displayName = cursor.getString(2);
familyName = cursor.getString(3);
givenName = cursor.getString(4);
phoneticName = cursor.getString(5);
phoneticFamilyName = cursor.getString(6);
phoneticGivenName = cursor.getString(7);
starred = cursor.getInt(8)==1;
}else if(CommonDataKinds.Email.CONTENT_ITEM_TYPE.equals(mimetype)){
email = cursor.getString(2);
mailList.add(email);
}else if(CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE.equals(mimetype)){
groupRowId = cursor.getInt(2);
groupIdList.add(groupRowId);
groupNameList.add(titleMap.get(groupRowId));
}
Integer contactId = null;
while(cursor.moveToNext()){
mimetype = cursor.getString(1);
if (StructuredName.CONTENT_ITEM_TYPE.equals(mimetype)){
displayName = cursor.getString(2);
familyName = cursor.getString(3);
givenName = cursor.getString(4);
phoneticName = cursor.getString(5);
phoneticFamilyName = cursor.getString(6);
phoneticGivenName = cursor.getString(7);
starred = cursor.getInt(8)==1;
}else if(CommonDataKinds.Email.CONTENT_ITEM_TYPE.equals(mimetype)){
email = cursor.getString(2);
mailList.add(email);
}else if(CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE.equals(mimetype)){
groupRowId = cursor.getInt(2);
groupIdList.add(groupRowId);
groupNameList.add(titleMap.get(groupRowId));
}
contactId = cursor.getInt(0);
if (!contactId.equals(id)){
String emails = mailList.toArray(new String{});
int groupIds = new int[groupIdList.size()];
int n=0;
for(int i:groupIdList){
groupIds[n] = i;
n++;
}
String titles = groupNameList.toArray(new String{});
// 抽象メソッド実行
onRead(id, displayName, familyName, givenName, phoneticName, phoneticFamilyName, phoneticGivenName, starred
, emails, groupIds, titles);
displayName = null;
email = null;
groupRowId = null;
familyName = null;
givenName = null;
phoneticName = null;
phoneticFamilyName = null;
phoneticGivenName = null;
starred = false;
mailList.clear();
groupIdList.clear();
groupNameList.clear();
id = contactId;
}
}
if (contactId != null){
String emails = mailList.toArray(new String{});
int groupIds = new int[groupIdList.size()];
int n=0;
for(int i:groupIdList){
groupIds[n] = i;
n++;
}
String titles = groupNameList.toArray(new String{});
// 抽象メソッド実行
onRead(contactId, displayName, familyName, givenName, phoneticName, phoneticFamilyName, phoneticGivenName, starred
, emails, groupIds, titles);
}
}
cursor.close();
}
}