2012-01-04 3 views
4

"contactID"ID를 가진 연락처에 속한 하나의 전화 번호를 검색하기 위해 다음 함수를 작성했습니다.Android에서 ContactsContract가있는 전화 번호 검색 - 기능이 작동하지 않습니다.

전화 번호를 검색하는 것입니다 기능 :

private String getContactPhone(String contactID) { 
    Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; 
    String[] projection = null; 
    String where = ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?"; 
    String[] selectionArgs = new String[] { contactID }; 
    String sortOrder = null; 
    Cursor result = managedQuery(uri, projection, where, selectionArgs, sortOrder); 
    if (result.moveToFirst()) { 
     String phone = result.getString(result.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
     if (phone == null) { 
      result.close(); 
      return null; 
     } 
     result.close(); 
     return phone; 
    } 
    result.close(); 
    return null; 
} 

이 함수가 호출되는 방법 : 불행하게도

ArrayList<Contact> resultContacts = new ArrayList<Contact>(); 
Cursor result = null; 
Uri uri = ContactsContract.Data.CONTENT_URI; 
String[] projection = new String[] { 
     ContactsContract.Contacts._ID, 
     ContactsContract.Contacts.DISPLAY_NAME, 
     ContactsContract.CommonDataKinds.Event.CONTACT_ID, 
     ContactsContract.CommonDataKinds.Event.START_DATE, 
}; 
String where = ContactsContract.Data.MIMETYPE+" = ? AND "+ContactsContract.CommonDataKinds.Event.TYPE+" = "+ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY; 
String[] selectionArgs = new String[] {ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE}; 
String sortOrder = null; 
result = managedQuery(uri, projection, where, selectionArgs, sortOrder); 
while (result.moveToNext()) { 
    Long id = result.getLong(result.getColumnIndex(ContactsContract.Contacts._ID)); 
    String phone = getContactPhone(String.valueOf(id)); 
    ... 
} 
... 

, 그것은 작동하지 않습니다. 이 함수를 "ContactsContract.Contacts._ID"에서 가져온 값으로 호출하면 null이됩니다. 이게 왜 그렇게? 뭐가 잘못 되었 니?

편집 : - 작동하지 않았다 나는 CommonDataKinds.Phone.CONTACT_ID에 Contacts._ID를 매핑하는 데 사용. 하지만 이제는 Contacts.DISPLAY_NAME을 CommonDataKinds.Phone.DISPLAY_NAME에 매핑하고 갑자기 작동합니다. 이상하지 않습니까? 하지만 표시 이름 대신 ID를 매핑하는 것이 좋습니다. 그래서 문제는 여전히 화제입니다. 이 테이블에있는 다른 ID 때문일 수 있습니까? 이 이유가 조회 ID가 있습니까?

+0

연락처가 하나만 있다고 확인 했습니까? – tidbeck

+0

예, 첫 번째 쿼리의 결과 커서를 반복하면서 모든 연락처에 전화 번호를 가져 오려고합니다. 연락처가 두 개인 경우 표시 이름과도 작동하지 않습니다. – caw

+0

'contactId'를 얻는 방법을 보여줄 수있어서 내가이 자기를 시도 할 수 있을까요? – tidbeck

답변

10

첫 번째 부분에서 연락처 ID를 얻으려면, 당신은 사용해야 대신

ContactsContract.Data.CONTACT_ID 

:

ContactsContract.Contacts._ID 

을 따라서 투사가되어야한다 :

String[] projection = new String[] { 
     ContactsContract.Data.CONTACT_ID, 
     ContactsContract.CommonDataKinds.Event.CONTACT_ID, 
     ContactsContract.CommonDataKinds.Event.START_DATE, 
}; 

그리고 물론 올바른 행을 얻으십시오 :

Long id = result.getLong(result.getColumnIndex(ContactsContract.Data.CONTACT_ID)); 
+0

아니요, 질문에 대한 편집을 참조하십시오. 하지만 지금까지 답변 주셔서 감사합니다 :) – caw

+0

@ MarcoW. 나는 당신이 질문에 더 많은 세부 사항을 제공했을 때 대답을 업데이트했다. 이것은 나를 위해 일했다. – tidbeck

+0

정말 고마워요! Contacts._ID가 잘못된 필드 인 이유는 무엇입니까? 그 분야에 무엇이 있습니까? – caw

1

영사를 null로 설정 했으므로 null이 표시됩니다. 투영법은 기본적으로 반환하려는 열의 목록입니다. 보통

String[] projection = {ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.HAS_PHONE_NUMBER}; 

, 당신은 연락처를 찾을 때 예를 들어, 전화 번호, 반복 다른 커서를 사용할 필요가 있으므로, 그들은, 전화 번호 목록이있을 수 있습니다

Cursor phones = mContext.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId, null, null);  
while (phones.moveToNext()) 
{  
    phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DATA)); 
} 

희망이 있습니다.

+0

답변 해 주셔서 감사합니다! 귀하의 예제에서도 투영을 null로 설정 했습니까? 프로젝션이 null 일 때 커서가 모든 열을 반환한다고 생각했습니다. 잘못인가? – caw

+1

당신 말이 맞아요. 기본적으로 null로 모든 열을 반환합니다. – Yury

+0

네 말이 맞아. 죄송합니다, null을 놓쳤습니다. 내가 제안 할 수있는 유일한 방법은 contactID가 유효한지 확인하고 메소드를 통해 디버그하는 것입니다. 아마도 모든 연락처를 먼저 가져오고 통과 된 contactID가 있는지 확인하십시오. –

1

getContactPhone() 코드가 내 문제없이 작동합니다. 연락처 피커를 시작하고 연락처를 선택한 다음 반환 된 ID를 메서드에 전달하여 테스트했습니다.

잘못된 ID를 전달한 것 같습니다. 널 포인터 예외에 대한 전체 스택 추적을 게시 할 수 있습니까?

예를 들어, 동기화 및 연락처 집계가 변경되기 때문에 _ID가 동일하게 유지 될 수 없기 때문에 조회 키를 사용할 수 있습니다.

+0

답변 해 주셔서 감사합니다! 널 포인터 예외는 없으며 managedQuery는 단지 어떤 행도 찾을 수 없습니다. 질문에 전체 코드를 참조하십시오 :) – caw

+1

+1 당신이 맞았 어 :) 고마워요! – caw

관련 문제