2011-08-10 9 views
6

전화에서 발신 SMS 메시지 수를 계산하는 응용 프로그램을 만들려고합니다. 현재 나는 다음과 같은 코드를 가지고 : 나는 한 페이지 SMS 메시지를 보낼 때Android : 발신 SMS 수신 번호가 잘못되었습니다.

private void listenForSMS(){ 
    Log.v("SMSTEST", "STARTED LISTENING FOR SMS OUTGOING"); 
    Handler handle = new Handler(){}; 

    SMSObserver myObserver = new SMSObserver(handle); 

    ContentResolver contentResolver = getContentResolver(); 
    contentResolver.registerContentObserver(Uri.parse("content://sms"),true, myObserver); 
} 

private class SMSObserver extends ContentObserver{ 

    int count = 0; 
    String lastMessage = null; 

    public SMSObserver(Handler handler) { 
     super(handler); 
    } 

    public void onChange(boolean selfChange) { 
     super.onChange(selfChange); 

     Log.v("SMSTEST", "HIT ON CHANGE"); 

     Uri uriSMSURI = Uri.parse("content://sms"); 
     Cursor cur = getContentResolver().query(uriSMSURI, null, null, 
        null, null); 
     cur.moveToNext(); 
     String protocol = cur.getString(cur.getColumnIndex("protocol")); 
     if(protocol == null){ 
      count++; 
      Log.v("SMSTEST", "SMS SENT: count: " + count); 
      String content = cur.getString(cur.getColumnIndex("body")); 

     }else{ 
      Log.v("SMSTEST", "SMS RECIEVED"); 
     } 
    } 
} 

onChange 3 번이라고합니다. 두 페이지의 SMS 메시지를 보내면 onChange이 4 번 호출됩니다. 3 페이지 메시지, 5 번 호출; 등등.

참고 : "content : // sms/sent"와 같은 Uri.parse("content://sms")의 다른 변형을 시도했지만 "content : // sms"이외의 다른 문자는 onChange이 호출되었습니다.

보내는 SMS 메시지를 고유하게 구분하고 보낸 SMS 메시지 수를 정확하게 계산하려면 어떻게해야합니까?

+0

사실 아주 간단합니다. while 루프를 만들고 where date> = someTime을 쿼리하면됩니다. –

답변

2

문제점에 대한 해결책을 찾았습니다. SMS와 MMS는 _id 값으로 고유하게 구분할 수 있습니다.

Uri uriSMSURI = Uri.parse("content://sms"); 
    Cursor cur = getContentResolver().query(uriSMSURI, null, null, 
       null, null); 
    cur.moveToNext(); 
String id = cur.getString(cur.getColumnIndex("_id")); 
0

나가는 SMS 메시지를 고유하게 구분하고 정확한 수의 SMS 메시지를 보낼 수 있습니까?

수 없습니다.

이 콘텐츠 공급 업체는 Android SDK에 포함되어 있지 않습니다. 그 사용법은 문서화되지 않았고 지원되지 않습니다. 또한, 특정 메시지 클라이언트 (예 : AOSP Messenger 앱)가 자체적으로 문서화되지 않고 지원되지 않는 방법을 사용하는 방법도 있습니다. 보낸 단일 SMS로 인해 콘텐츠 공급자가 1,337 번 변경 될 수 있으며이를 알 수있는 방법이 없습니다. 또한 발신 SMS 메시지가이 콘텐츠 공급자 또는 다른 콘텐츠 공급자에도 기록 될 필요가 없습니다. recent behavior이 표시되면 향후 Google에서 해당 콘텐츠 제공 업체에 대한 제 3 자 액세스를 종료 할 수 있습니다.

4

SMS 메시지를 보낼 때 메시지 상태를 저장합니다. 이를 해결하기 위해, 당신은 그 유형이 int type = c.getInt(c.getColumnIndex("type")); 3 회를 기록 확인 onchange를() :
1 : 유형 = 6
2 : 유형 = 4
3 : 유형 = 2 (성공) 다음
이 증가 할 수 있습니다 계수기.
이 경우는 수신자 1 명에게만 적용됩니다.
받는 사람이 1 명 더 많은 경우 형식을 가져 오려면 "thread_id"및 "seen"를 다시 쿼리해야합니다. 성공한 메시지 수를 확인할 수 있습니다.
행운을 빌어 요!

+0

이것은 중복 SMS 트리거에 대해 찾을 수있는 최상의 솔루션입니다. 나의 경우에는 나가는 sms 만 3 번 방아쇠를 당겼다. 들어오는 SMS에는 문제가 없습니다. 이 상태는 각각 무엇을 나타 냅니까? 6과 4는 무엇입니까? 유형 4가 표시되지 않습니다. 유형 6을 처음 받으면 유형 2를 얻습니다. 형식 코드는 디바이스마다 다릅니다. 이게 믿을만한가요? – nous

+0

@kevin : 실패 시나리오를 처리 할 수 ​​있습니까? –

관련 문제