安卓:检测短信发送,计数错误

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次。三页短信,则被调用5次;以此类推。
注意:我尝试了其他变体的Uri.parse("content://sms"),例如"content://sms/sent",但除了"content://sms"之外,没有任何其他方法能够使onChange被调用。
如何唯一区分已发出的短信并准确计算发送的短信数量?

我找到了一个实际上相当简单的解决方案。只需创建一个while循环并查询WHERE date>=someTime。 - Joshua Abrams
3个回答

4

请注意,当您发送短信时,它将保存消息的状态。为解决此问题,您需要检查这些记录的类型:int type = c.getInt(c.getColumnIndex("type")); 3次onchange()事件:
第1个:type = 6
第2个:type = 4
第3个:type = 2(成功)
然后,您可以增加计数器。
此情况仅适用于一个收件人。
如果有多个收件人,则需要重新查询“thread_id”和“seen”以获取类型。您可以检查有多少消息已成功发送。
祝您好运!


这是我能找到的重复短信触发器的最佳解决方案。在我的情况下,只有发送的短信被触发了三次。收到的短信没有问题。 这些状态分别代表什么?6和4是什么?我没有看到类型4。第一次我得到类型6,然后另外两次我得到类型2。类型代码会因设备而异吗?这可靠吗? - nous
@kevin:处理失败情况是否可行? - Vineesh TP

2
我找到了解决我的问题的方法。短信和彩信可以通过它们的_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
如何唯一区分一个发送的短信并准确计算发送的短信数量?
你不能。
该内容提供者不是Android SDK的一部分。它的使用未经记录和支持。此外,任何给定的消息客户端(例如AOSP Messenger应用程序)可能如何使用它本身也未经记录和支持。单个发送的短信可能会导致对内容提供者进行1,337次更改,而您无法知道。此外,没有要求将发送的短信甚至记录在此或任何内容提供者中。如果最近的行为是任何迹象,谷歌将来可能会关闭对此内容提供者的第三方访问。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接