2012-08-16 3 views
0

사용자가 보낸 발신 SMS 수를 계산하려고합니다. 현재, 내 코드는 다음과 같이 진행됩니다Jelly Bean에서 보낸 SMS에 대해 ContentObserver에 전달할 올바른 URI는 무엇입니까?

class SentSMSObserver extends ContentObserver { 
.... 
} 

SentSMSObserver sso = new SentSMSObserver(new Handler()); 
ContentResolver cr = this.getContentResolver(); 
cr.registerContentObserver(Uri.parse("content://sms"), true, sso); 

나는 젤리 나는 기본 SMS 앱을 통해 문자 메시지를 보낼 때 어떤 이유로, 내 집계 로를 증가 스포츠 에뮬레이터에서 응용 프로그램을 실행하려고 세.

지금, 관련 StackOverflow의 q를 & 제안 A의 같은 content://sms/sentcontent://sms을 교체하기로 결정했습니다,하지만 난 그 설정으로 응용 프로그램을 실행할 때, 심지어 실행하지내 콘텐츠 관찰자의 onChange(). 나는 무엇을해야합니까?

+1

[이] (http://stackoverflow.com/questions/11980788/differentiate-inbox-and-sentsms-from-all-sms/11980856#11980856)와 같은 것을 시도 했습니까? –

답변

0

Lalit Poptani가 제안한 answer에서 커서가 현재 가리키고있는 레코드의 "유형"값을 가져와야합니다.

nandeesh 내 토론에서 언급 한 바와 같이
// cr is the content resolver 
Cursor cursor = cr.query(Uri.parse("content://sms"), null, null, null, null); 
int columnIndex = cursor.getColumnIndex("type"); 

while (cursor.moveToNext()) { 
    int type = cursor.getInt(columnIndex); 
    if (type == 2) { 
     // do your stuff here 
    } 
} 

는 메시지 유형은 공개 API의 일부가 아닌,하지만 그들은 here를 찾을 수 있습니다.

현재 한 명 이상의 수신자에게 보낼 때 하나의 보낸 SMS 메시지가 부정확 해지는 버그를 수정하고 있습니다 (2 명에게 3 명, 3 명으로 5 명 전송). 메시지 유형을 필터링해도 콘텐츠 관찰자는 단일 메시지에 대해서도 두 번 이상 호출됩니다. 내가 고칠 때이 답변에 대한 업데이트를 게시 할 것입니다.

0

db updater가 등록한 정확한 URI를 호출하면 registerContentObserver의 콜백이 호출됩니다. 그러나 귀하의 경우에 MMS 앱은 content : // sms/sent를 사용하지 않고 content://sms/10과 같은 것을 사용하고 QUEUED 유형에서 OUTBOX로 이동 한 다음 SENT로 계속 이동합니다. 그래서 당신이 등록 할 때 3 업데이트를받는 이유가 맞습니다. content://sms/

MMS App은 대기열에 넣은 후 매번 TYPE 열을 변경합니다.

이 문제를 해결하는 한 가지 방법은 uri에 대한 콘텐츠 변경 콜백 쿼리를 얻을 때마다 "type"열을 가져 와서 해당 값이 Telephony.Sms.MESSAGE_TYPE_SENT인지 확인하는 것입니다.

+0

나는 'Telephony.Sms.MESSAGE_TYPE_SENT'을 가져올 수 없으므로, 여기에 설명 된대로 그 동안'2 '로 바꿀 것입니다 : http://www.androidjavadoc.com/m5-rc15/constant- values.html # android.provider.Telephony.TextBasedSmsColumns.MESSAGE_TYPE_SENT 대신 상수를 사용할 수있는 방법이 있습니까? –

+0

전화가 공공 API라고 생각했습니다. 나는 그것이 그것이 숨겨 졌다는 것을 깨닫지 못했다. 매우 복잡하지만 여기를 볼 수 있습니다. http://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-1-introduction/ – nandeesh

+0

매우 우수하고 안전한 프로그래밍 실습이 아닌 것처럼 보입니다. 그래서 나는 위의 그의 의견에서 Lalit Poptani가 제안한대로'== 2 '로 그칠 것입니다. –

관련 문제