2011-08-10 16 views
6

Próbuję złożyć wniosek o policzenie liczby wychodzących wiadomości SMS z telefonu. Obecnie mam następujący kod:Android: Wykryj wychodzące wiadomości SMS, niepoprawne liczby

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"); 
     } 
    } 
} 

Kiedy wysłać jedną stronę do wiadomości SMS, onChange nazywa się 3 razy. Kiedy wysyłam dwustronicową wiadomość SMS, onChange jest wywoływana 4 razy. 3-stronicowa wiadomość, nazywana 5 razy; I tak dalej.

UWAGA: Próbowałem inne odmiany Uri.parse("content://sms"), takie jak "content: // sms/wysłane" i nic innego niż "content: // sms" ma zdobyć onChange być nazywany.

W jaki sposób mogę jednoznacznie odróżnić wychodzącą wiadomość SMS i uzyskać dokładną liczbę wysłanych wiadomości SMS?

+0

Znalazłem rozwiązanie, które jest całkiem proste. Po prostu wykonaj pętlę i zapytaj WHERE date> = someTime. –

Odpowiedz

2

Znalazłem rozwiązanie mojego problemu. SMS-y i MMS-y można w wyjątkowy sposób rozróżniać na podstawie ich wartości _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

W jaki sposób mogę jednoznacznie odróżnić wychodzącą wiadomość SMS i uzyskać dokładną liczbę wysłanych wiadomości SMS?

Nie możesz.

Ten dostawca treści nie należy do zestawu Android SDK. Jego użycie jest nieudokumentowane i nieobsługiwane. Co więcej, jakikolwiek dany klient wiadomości (np. Aplikacja AOSP Messenger) może z niego korzystać, sam jest nieudokumentowany i nieobsługiwany. Pojedynczy wysłany SMS może skutkować 1,337 zmianami dostawcy treści i nie możesz tego wiedzieć. Ponadto nie ma wymogu, aby wychodzące wiadomości SMS były nawet zapisywane w tym lub dowolnym dostawcy treści. A jeśli podana jest informacja: recent behavior, możliwe, że Google w przyszłości wyłączy dostęp strony trzeciej do tego dostawcy treści.

4

Należy pamiętać, że po wysłaniu wiadomości SMS zostanie zapisany status wiadomości. Aby go rozwiązać, należy sprawdzić typ, który rejestruje int type = c.getInt(c.getColumnIndex("type")); 3 razy onchange():
1-te: type = 6
2-ty: type = 4
3-ty: type = 2 (sukces)
następnie można zwiększyć licznik.
Ten przypadek dotyczy tylko 1 odbiorcy.
Jeśli jest o wiele więcej 1 odbiorcy, należy podać "thread_id" i "seen", aby uzyskać typ. Możesz sprawdzić liczbę wysłanych wiadomości.
Powodzenia!

+0

To najlepsze rozwiązanie, jakie mogłem znaleźć dla zduplikowanych wyzwalaczy SMS. W moim przypadku tylko wychodzące sms został wywołany trzy razy. Brak problemów z przychodzącym SMS-em. Co oznacza każdy z tych statusów? Co to jest 6 i 4? Nie widzę typu 4. Po raz pierwszy otrzymuję typ 6, a następnie dwa razy otrzymuję typ 2. Czy kod typu różni się w zależności od urządzenia? Czy to jest wiarygodne? – nous

+0

@kevin: Czy można obsłużyć awaryjny scenariusz? –

Powiązane problemy