Android: обнаружение исходящих SMS, неверный счет - PullRequest
7 голосов
/ 10 августа 2011

Я пытаюсь создать приложение для подсчета количества исходящих 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");
        }
    }
}

Когда я отправляю одностраничное SMS-сообщение, onChange вызывается 3 раза. Когда я отправляю двухстраничное SMS-сообщение, onChange вызывается 4 раза. 3-страничное сообщение, вызываемое 5 раз; И так далее.

ПРИМЕЧАНИЕ: я пробовал другие варианты Uri.parse("content://sms"), такие как "content: // sms / sent", и ничего кроме "content: // sms" не получил onChange для вызова.

Как можно однозначно отличить исходящее SMS-сообщение и получить точный счетчик количества отправленных SMS-сообщений?

Ответы [ 3 ]

4 голосов
/ 06 мая 2012

Обратите внимание, что при отправке SMS-сообщения сохраняется статус сообщения.Чтобы решить эту проблему, вы проверяете тип этих записей int type = c.getInt(c.getColumnIndex("type")); 3 раза onchange ():
1st: type = 6
2nd: type = 4
3rd: type = 2 (success)
затем вы можете увеличить свой счетчик.
Этот случай применяется только для 1 получателя.
Если есть еще 1 получатель, необходимо запросить "thread_id" и "seen", чтобы получить тип.Вы можете проверить, сколько сообщений отправлено успешно.
Удачи!

2 голосов
/ 15 августа 2011

Я нашел решение своей проблемы.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 голосов
/ 10 августа 2011

Как я могу однозначно отличить исходящее SMS-сообщение и получить точный счетчик количества отправленных SMS-сообщений?

Вы не можете.

Это содержимоепоставщик не является частью Android SDK.Его использование недокументировано и не поддерживается.Более того, то, как любой конкретный клиент обмена сообщениями (например, приложение AOSP Messenger) может использовать его, сам по себе недокументирован и не поддерживается.Одно отправленное SMS может привести к 1337 изменениям в поставщике контента, и у вас нет возможности узнать об этом.Кроме того, нет необходимости записывать исходящие SMS-сообщения даже в этом или любом поставщике контента.И, если недавнее поведение является какой-либо индикацией, вполне возможно, что Google в будущем закроет сторонний доступ к этому поставщику контента.

...