2017-02-01 18 views
0

항목을 클릭 할 때 하나의 연락처를 여러 개 가져올 응용 프로그램이 있습니다. 연락처에 번호가 두 개 이상있는 경우 연락처의 목록보기가 여러 개 있습니다. 내 코드는 입니다. 모든 숫자를 얻었지만 클릭 수는 여러 개인 숫자를 얻을 수 없습니다.안드로이드의 한 연락처의 모든 번호를 프로그래밍 방식으로 찾는 방법은 무엇입니까?

당신이 발견 한 제대로 각 연락처에 대한 모든 전화를 통해 반복하고 있지만 while 루프가 종료 될 때, phone 마지막 전화 만 가리키는 것 같다

ContentResolver cr = getContentResolver(); 
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, 
      null, null, null); 
    String phone = null; 
    String emailContact = null; 
    String emailType = null; 
    String image_uri = ""; 
    Bitmap bitmap = null; 
    if (cur.getCount() > 0) { 
     while (cur.moveToNext()) 
     { 
      String id = cur.getString(cur 
        .getColumnIndex(ContactsContract.Contacts._ID)); 
      String name = cur 
        .getString(cur 
          .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 

      image_uri = cur 
        .getString(cur 
          .getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI)); 
      if (Integer 
        .parseInt(cur.getString(cur 
          .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { 
       System.out.println("name : " + name + ", ID : " + id); 

       Cursor pCur = cr.query(
         ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
         null, 
         ContactsContract.CommonDataKinds.Phone.CONTACT_ID 
           + " = ?", new String[]{id}, null); 
       while (pCur.moveToNext()) 
       { 
        phone = pCur 
          .getString(pCur 
            .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 

        String phone1 = pCur 
          .getString(pCur 
            .getColumnIndex(String.valueOf(ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE))); 
         Log.e("PHONE",phone1); 
        System.out.println("phone" + phone); 
       } 
       pCur.close(); 

       Cursor emailCur = cr.query 
         (
         ContactsContract.CommonDataKinds.Email.CONTENT_URI, 
         null, 
         ContactsContract.CommonDataKinds.Email.CONTACT_ID 
           + " = ?", new String[]{id}, null); 
       while (emailCur.moveToNext()) 
       { 
        emailContact = emailCur 
          .getString(emailCur 
.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); 


if(TextUtils.isEmpty(emailContact)||emailContact.equalsIgnoreCase(null)|| 
emailContact.equalsIgnoreCase("")){ 
         emailContact=""; 

         Log.e("isEmpty","isEmpty " + emailContact); 
        }else{ 
         Log.e("gfdszfg","Email " + emailContact); 
        } 
        /* emailType = emailCur 
          .getString(emailCur 
            .getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));*/ 

        Log.e("gfdszfg","Email " + emailContact); 

       } 

       emailCur.close(); 
      } 

      if (image_uri != null) { 
       System.out.println(Uri.parse(image_uri)); 
       try { 
        bitmap = MediaStore.Images.Media 
          .getBitmap(this.getContentResolver(), 
            Uri.parse(image_uri)); 

        System.out.println(bitmap); 

       } catch (FileNotFoundException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 

      mList.add(new Contacts(name, phone, image_uri,emailContact)); 
      emailContact=""; 
     } 
     cur.close(); 
     mMyContactsAdapter = new MyContactsAdapter(MainActivity.this, 
    mList); 
     mcontact.setAdapter(mMyContactsAdapter); 
    } 
} 
+0

참조 http://stackoverflow.com/a/26820544/2252830 – pskink

답변

0

MainActivity.java .

... 
List<String> phonesList = new ArrayList<String>(); 
while (pCur.moveToNext()) { 
    phone = pCur.getString(... Phone.NUMBER)); 
    // add the phone to a growing list of phones 
    phonesList.add(phone); 
} 
pCur.close(); 
... 
// Change 'Contacts' constructor to accept List<String>, rather then String for phone 
mList.add(new Contacts(name, phonesList, image_uri,emailContact)); 
... 

은 물론 당신은 이메일에 대한 동일한 작업을 수행 할 수 있으며, 당신도 휴대 전화의 라벨을 원하는 경우, 당신은 쌍의 목록이 필요합니다 : 전화 + 라벨의 쌍을 개최 List<Pair<String, String>>을. 측면에

이 코드의 성능이 HashMap에 모두 넣고, 장치의 ContactsContract.Data.CONTENT_URI 에 대한 모든 이메일과 전화를 조회하여 significantly을 개선하고 반복하는 모든 연락처, 이메일 및 전화를 받고있을 수 있습니다 HashMap에서 그러면 쿼리 수가 <number of contacts>*2에서 2으로 줄어 듭니다.

+0

위에서 제안한대로 초기 연락처 목록을 설정하면 목록보기 @marmor –

+0

을 클릭하면 여러 연락처 번호를 어떻게 얻을 수 있습니까? '전화 번호부'개체의 목록이 있으며 각각에는 전화 목록이 들어 있습니다. 따라서 항목을 클릭하면 DB에서 아무 것도 쿼리하지 않고 클릭 한 '연락처'개체에서 전화 목록 만 가져올 수 있습니다. – marmor