我编写了一个应用程序来侦听从默认消息传递应用程序发送的短信。
当我使用以下代码时,该应用程序未触发发送的短信。
SMSSentObserver smsSentObserver = new SMSSentObserver(null, this);
ContentResolver contentResolver = this.getContentResolver();
contentResolver.registerContentObserver(Uri.parse("content://sms/sent"), true, smsSentObserver);
然后,通过使用以下代码,将触发内容观察器。
SMSSentObserver smsSentObserver = new SMSSentObserver(null, this);
ContentResolver contentResolver = this.getContentResolver();
contentResolver.registerContentObserver(Uri.parse("content://sms"), true, smsSentObserver);
我能够监听发送的短信,但是SMSSentObserver(实现ContentObserver)onCreate()方法被调用了不止一次。然后我在代码中添加条件以找出发送的短信事件。但是条件通过两个事件通过。
public class SMSSentObserver extends ContentObserver {
private final Context _context;
public SMSSentObserver(Handler handler, Context context) {
super(null);
_context = context;
}
@Override
public void onChange(boolean selfChange) {
saveSentSMS();
super.onChange(selfChange);
}
private void saveSentSMS() {
Uri uriSMSURI = Uri.parse("content://sms/sent");
Cursor cur = this._context.getContentResolver().query(uriSMSURI, null, null, null, null);
if(null == cur) {
return;
}
if(cur.moveToFirst()) {
String strProtocol = cur.getString(cur.getColumnIndex("protocol"));
if(null != strProtocol) { //for sent messages protocol will be null.
return;
}
int type = cur.getInt(cur.getColumnIndex("type"));
if(type == 2) {
String strSMSBody = cur.getString(cur.getColumnIndex("body"));
String strPhoneNo = cur.getString(cur.getColumnIndex("address"));
long smsDateTime = cur.getLong(cur.getColumnIndex("date"));
String serviceCenter = cur.getString(cur.getColumnIndex("service_center"));
String strStatus = cur.getString(cur.getColumnIndex("status"));
String strPerson = cur.getString(cur.getColumnIndex("person"));
Log.e("Info", "SMS saved");
}
}
}
}
"短信已保存"在猫日志中显示两次,而不是一次。有人可以告诉我,还有其他方法可以找出发送的短信吗?
任何帮助将不胜感激。
似乎是一个常见问题。我尝试了其他几种方法,终于想出了一个解决方案。
ContentObserver的onChange()在我的情况下被触发了三次,用于传出的短信。我看到您已经尝试使用类型->cur.getColumnIndex("type")。类型可以是 6、4 或 2。就我而言,在触发事件的三次中,有两次我得到了类型 2。这似乎不可靠。此外,还不确定这是否在所有设备中都相同。我通过使用smsCursor.getString(msgIndex)检查messageID来解决这个问题。将其存储在共享首选项中。下次事件触发器时,将旧 messageID 与新 messageID 进行比较。仅当 ID 不同时才提取内容。这样,您可以避免重复。