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

Posted

技术标签:

【中文标题】Android:检测短信传出,计数不正确【英文标题】:Android: Detect SMS Outgoing, Incorrect Count 【发布时间】:2011-10-24 04:06:33 【问题描述】:

我正在尝试制作一个应用程序来计算从手机发出的 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");
        
    

当我发送一页短信时,onChange 被调用了 3 次。当我发送两页短信时,onChange 被调用了 4 次。 3页留言,调用5次;以此类推。

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

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

【问题讨论】:

我找到了一个实际上非常简单的解决方案。只需创建一个 while 循环并查询 WHERE date>=someTime. 【参考方案1】:

请注意,当您发送 SMS 消息时,它会保存消息的状态。要解决它,您检查记录的类型int type = c.getInt(c.getColumnIndex("type")); 3 次 onchange(): 第一个:类型 = 6 第二:类型 = 4 第三个:type = 2(成功) 那么你可以增加你的计数器。 此案例仅适用于 1 位收件人。 如果接收者多于 1 个,需要重新查询“thread_id”和“seen”来获取类型。您可以检查有多少消息发送成功。 祝你好运!

【讨论】:

这是我能为重复短信触发器找到的最佳解决方案。在我的情况下,只有传出的短信被触发了 3 次。收到的短信没有问题。这些状态中的每一个代表什么?什么是6和4?我没有看到类型 4。我第一次得到类型 6,然后另外两次得到类型 2。类型代码是否因设备而异?这个靠谱吗? @kevin : 是否可以处理失败场景?【参考方案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"));

【讨论】:

【参考方案3】:

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

你不能。

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

【讨论】:

以上是关于Android:检测短信传出,计数不正确的主要内容,如果未能解决你的问题,请参考以下文章

Android:使用 ContentObserver 或接收器不工作来捕捉传出的短信

通过 contentObserver 阻止传出短信

如何知道短信在 Android 中是不是正确发送?

传入和传出字节的 SQL Server 性能计数器

如何将变量传入和传出AsyncTasks?

安卓手机短信Android SMS 对话号thread_id如何产生与变化