7

我正在尝试制作一个应用程序来计算手机发出的短信数量。目前我有以下代码:

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 次。当我发送一条两页短信时,onChange被调用了 4 次。3页留言,调用5次;等等。

注意:我已经尝试过其他变体Uri.parse("content://sms"),例如“content://sms/sent”,除了“content://sms”之外没有其他任何东西onChange被调用。

如何唯一区分一条外发短信并准确统计已发短信的条数?

4

3 回答 3

4

请注意,当您发送 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”来获取类型。您可以检查有多少消息发送成功。
祝你好运!

于 2012-05-06T10:19:36.460 回答
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"));
于 2011-08-15T17:04:14.207 回答
0

如何唯一区分一条外发短信并准确统计已发短信的条数?

你不能。

此内容提供程序不是 Android SDK 的一部分。它的使用没有记录且不受支持。此外,任何给定的消息传递客户端(例如,AOSP Messenger 应用程序)可能如何使用它本身是未记录和不受支持的。一条发送的 SMS 可能会导致内容提供商发生 1,337 次更改,而您无法知道。此外,甚至不需要在此或任何内容提供商中记录传出的 SMS 消息。而且,如果最近的行为有任何迹象,谷歌可能会在未来关闭第三方对该内容提供商的访问。

于 2011-08-10T16:01:59.663 回答