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:检测短信传出,计数不正确的主要内容,如果未能解决你的问题,请参考以下文章