Android:检测短信传出,不正确的计数

时间:2011-08-10 14:44:30

标签: android sms detect contentobserver

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

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调用

如何唯一地区分外发短信并准确计算发送的短信数量?

3 个答案:

答案 0 :(得分:4)

请注意,当您发送短信时,它会保存短信的状态。要解决此问题,请检查记录的类型int type = c.getInt(c.getColumnIndex("type")); 3次onchange():
1st:type = 6
第二名:type = 4
第3名:type = 2(成功)
然后你可以增加你的柜台 此案例仅适用于1个收件人。
如果有更多1个收件人,需要重新查询“thread_id”和“seen”以获取该类型。您可以查看已成功发送的邮件数量。
祝你好运!

答案 1 :(得分: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"));

答案 2 :(得分:0)

  

如何唯一地区分外发短信并准确计算发送的短信数量?

你不能。

此内容提供商不是Android SDK的一部分。它的使用没有记录,也没有用。此外,任何给定的消息传递客户端(例如,AOSP Messenger应用程序)可能如何使用它本身没有文档记录且不受支持。单个发送的SMS可能会导致内容提供商进行1,337次更改,您无法知道。此外,不要求传出的SMS消息甚至记录在该或任何内容提供商中。而且,如果recent behavior有任何迹象,Google将来可能会关闭对此内容提供商的第三方访问权限。