2017-05-23 4 views
0

특정 연락처에서 모든 SMS 메시지를 어떻게 검색합니까?연락처 ID가있는 경우 특정 사용자가 모든 SMS 메시지를 쿼리하는 방법

모든 SMS 메시지를 검색 한 다음 특히 그 사람에게 걸러내는 방법을 발견했습니다. 하지만 연락처 ID/전화 번호를 사용하여 쿼리하고 싶습니다.

ContactsContract.CommonDataKinds.Phone.NUMBER을 사용하여 연락처를 쿼리하고 있습니다. 그러나 해당 문자열은 의 address 형식과 일치하지 않는 것으로 보입니다.

하나의 숫자는 괄호와 대시를 사용하지만 다른 숫자는 그렇지 않습니다.

항상이 경우입니까? 그렇지 않은 경우 이미 연락처 ID가 있으면 모든 SMS 메시지를 쿼리하는 가장 좋은 방법은 무엇입니까?

답변

0

여러 가지 방법이 있지만 가장 좋은 방법은 해당 연락처/번호로 대화 스레드의 스레드 ID를 찾은 다음 모든 메시지의 스레드 ID를 쿼리하는 것입니다.

주 (자신의 스레드 ID로) 다른 API 레벨, 모든 스레드 등

쿼리 듀얼 SIM, MMS/SMS 메시지와 장치에 문제가 많이 있다는 것을 :

// This projection is suitable for API-19 and above only 
String[] projection = { Threads._ID, Threads.RECIPIENT_IDS, "sort_index", Threads.SNIPPET } 
Uri uri = Threads.CONTENT_URI.buildUpon().appendQueryParameter("simple", "true").build(); 
Cursor cur = getContentResolver().query(uri, projection, selection, null, "sort_index" + " DESC"); 

RecipientId와 전화 번호를 변환하려면 Android의 RecipientIdCache class을 프로젝트에 복사하면됩니다. id를 number로 변환하는 데 사용되는 싱글 톤 클래스입니다. 스레드 ID로 모든 메시지

검색어 :

// This projection is suitable for API-19 and above only 
String[] projection = new String[]{ 
    MmsSms.TYPE_DISCRIMINATOR_COLUMN, 
    Telephony.Sms._ID, 
    Telephony.Sms.BODY, 
    "sort_index", 
    Telephony.Sms.DATE_SENT 
}; 
Uri uri = ContentUris.withAppendedId(Threads.CONTENT_URI, id); 
Cursor cur = getContentResolver().query(uri, projection, null, null, null); 
+0

는 recipientId가 같은 값 ContactsContract.Contacts._ID입니다인가? 그게 내가 가진거야. 사용자는 연락처 목록에서 a를 선택하고 그 연락처에 대한 모든 SMS를 읽어야합니다. 또한 RecipientIdCache는 content : // mms-sms/canonical-address 및 content : // mms-sms/canonical-addresses를 사용합니다. 이 둘의 차이점은 무엇입니까? – dumbkam

+0

아니요, contact-id가 recipient-id가 아니고 recipient-id가 sms 대화마다 고유 ID 인 경우 연락처, 연락처가 아닌 전화 번호, 전화 번호 그룹, 'GOOGLE'(유효한 SMS 주소)과 같은 특별한 비 전화 주소 – marmor

관련 문제