グループ名も同時に読み込む

ContentResolver で、電話帳の Email、氏名、所属グループの名称、全てを一度に取得しようと思っても、
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();
   }
}