尝试使用这种方式从内容提供商处获取最后一条短信。
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
Uri uriSMSURI = Uri.parse("content://sms/");
String selection = "type = '2'"; //Selection parameter to only select messages in sent folder
// save the message to the SD card here
Logger.d("On Change");
Toast.makeText(mCtx,"TEST", Toast.LENGTH_LONG).show();
Cursor cur = mCtx.getContentResolver().query(uriSMSURI, null, selection,
null, null);
String body = null;
if(cur.moveToFirst()){
body = cur.getString(cur.getColumnIndexOrThrow("body")).toString();
Logger.d(body);
cur.close();
}
但我总是最后来自OUTBOX的两个消息,但我想要唯一的最后一个。
我该如何以正确的方式做到这一点?
修改
使用文本“TWO”发送消息后记录:
01-09 16:10:27.205 4230-4230/? D/PRETTYLOGGER: ╔════════════════════════════════════════════════════════════════════════════════════════
01-09 16:10:27.205 4230-4230/? D/PRETTYLOGGER: ║ Thread: main
01-09 16:10:27.205 4230-4230/? D/PRETTYLOGGER: ╟────────────────────────────────────────────────────────────────────────────────────────
01-09 16:10:27.205 4230-4230/? D/PRETTYLOGGER: ║ ContentObserver.onChange (ContentObserver.java:129)
01-09 16:10:27.205 4230-4230/? D/PRETTYLOGGER: ║ SMSoutObserver.onChange (SMSoutObserver.java:46)
01-09 16:10:27.205 4230-4230/? D/PRETTYLOGGER: ╟────────────────────────────────────────────────────────────────────────────────────────
01-09 16:10:27.205 4230-4230/? D/PRETTYLOGGER: ║ On Change
01-09 16:10:27.205 4230-4230/? D/PRETTYLOGGER: ╚════════════════════════════════════════════════════════════════════════════════════════
01-09 16:10:27.245 4230-4230/? D/PRETTYLOGGER: ╔════════════════════════════════════════════════════════════════════════════════════════
01-09 16:10:27.245 4230-4230/? D/PRETTYLOGGER: ║ Thread: main
01-09 16:10:27.245 4230-4230/? D/PRETTYLOGGER: ╟────────────────────────────────────────────────────────────────────────────────────────
01-09 16:10:27.245 4230-4230/? D/PRETTYLOGGER: ║ ContentObserver.onChange (ContentObserver.java:129)
01-09 16:10:27.245 4230-4230/? D/PRETTYLOGGER: ║ SMSoutObserver.onChange (SMSoutObserver.java:54)
01-09 16:10:27.245 4230-4230/? D/PRETTYLOGGER: ╟────────────────────────────────────────────────────────────────────────────────────────
01-09 16:10:27.245 4230-4230/? D/PRETTYLOGGER: ║ ONE
01-09 16:10:27.245 4230-4230/? D/PRETTYLOGGER: ╚════════════════════════════════════════════════════════════════════════════════════════
01-09 16:10:27.265 1685-1685/? V/SmsReceiverService: onStart: #1 mResultCode: -1 = Activity.RESULT_OK
01-09 16:10:27.305 4230-4230/? D/PRETTYLOGGER: ╔════════════════════════════════════════════════════════════════════════════════════════
01-09 16:10:27.315 4230-4230/? D/PRETTYLOGGER: ║ Thread: main
01-09 16:10:27.325 4230-4230/? D/PRETTYLOGGER: ╟────────────────────────────────────────────────────────────────────────────────────────
01-09 16:10:27.325 4230-4230/? D/PRETTYLOGGER: ║ ContentObserver.onChange (ContentObserver.java:129)
01-09 16:10:27.325 4230-4230/? D/PRETTYLOGGER: ║ SMSoutObserver.onChange (SMSoutObserver.java:46)
01-09 16:10:27.325 4230-4230/? D/PRETTYLOGGER: ╟────────────────────────────────────────────────────────────────────────────────────────
01-09 16:10:27.325 4230-4230/? D/PRETTYLOGGER: ║ On Change
01-09 16:10:27.325 4230-4230/? D/PRETTYLOGGER: ╚════════════════════════════════════════════════════════════════════════════════════════
01-09 16:10:27.325 4230-4230/? D/PRETTYLOGGER: ╔════════════════════════════════════════════════════════════════════════════════════════
01-09 16:10:27.325 4230-4230/? D/PRETTYLOGGER: ║ Thread: main
01-09 16:10:27.325 4230-4230/? D/PRETTYLOGGER: ╟────────────────────────────────────────────────────────────────────────────────────────
01-09 16:10:27.325 4230-4230/? D/PRETTYLOGGER: ║ ContentObserver.onChange (ContentObserver.java:129)
01-09 16:10:27.325 4230-4230/? D/PRETTYLOGGER: ║ SMSoutObserver.onChange (SMSoutObserver.java:54)
01-09 16:10:27.335 4230-4230/? D/PRETTYLOGGER: ╟────────────────────────────────────────────────────────────────────────────────────────
01-09 16:10:27.335 4230-4230/? D/PRETTYLOGGER: ║ ONE
01-09 16:10:27.335 4230-4230/? D/PRETTYLOGGER: ╚════════════════════════════════════════════════════════════════════════════════════════
01-09 16:10:27.335 1685-1685/? V/SmsReceiverService: onStart: #1 mResultCode: -1 = Activity.RESULT_OK
01-09 16:10:27.355 4230-4230/? D/PRETTYLOGGER: ╔════════════════════════════════════════════════════════════════════════════════════════
01-09 16:10:27.355 4230-4230/? D/PRETTYLOGGER: ║ Thread: main
01-09 16:10:27.355 4230-4230/? D/PRETTYLOGGER: ╟────────────────────────────────────────────────────────────────────────────────────────
01-09 16:10:27.355 4230-4230/? D/PRETTYLOGGER: ║ ContentObserver.onChange (ContentObserver.java:129)
01-09 16:10:27.355 4230-4230/? D/PRETTYLOGGER: ║ SMSoutObserver.onChange (SMSoutObserver.java:46)
01-09 16:10:27.355 4230-4230/? D/PRETTYLOGGER: ╟────────────────────────────────────────────────────────────────────────────────────────
01-09 16:10:27.355 4230-4230/? D/PRETTYLOGGER: ║ On Change
01-09 16:10:27.355 4230-4230/? D/PRETTYLOGGER: ╚════════════════════════════════════════════════════════════════════════════════════════
01-09 16:10:27.355 4230-4230/? D/PRETTYLOGGER: ╔════════════════════════════════════════════════════════════════════════════════════════
01-09 16:10:27.355 4230-4230/? D/PRETTYLOGGER: ║ Thread: main
01-09 16:10:27.355 4230-4230/? D/PRETTYLOGGER: ╟────────────────────────────────────────────────────────────────────────────────────────
01-09 16:10:27.355 4230-4230/? D/PRETTYLOGGER: ║ ContentObserver.onChange (ContentObserver.java:129)
01-09 16:10:27.355 4230-4230/? D/PRETTYLOGGER: ║ SMSoutObserver.onChange (SMSoutObserver.java:54)
01-09 16:10:27.355 4230-4230/? D/PRETTYLOGGER: ╟────────────────────────────────────────────────────────────────────────────────────────
01-09 16:10:27.355 4230-4230/? D/PRETTYLOGGER: ║ TWO
01-09 16:10:27.355 4230-4230/? D/PRETTYLOGGER: ╚════════════════════════════════════════════════════════════════════════════════════════
答案 0 :(得分:0)
您可以在 query()
调用"date DESC LIMIT 1"
中设置最后一个参数,但这可能无处不在。
我误解了这个问题,这个问题已在评论中得到解决,因此我会将相关部分编辑到答案中以供参考。
当使用平台SMS应用程序以及许多第三方SMS客户端发送SMS消息时,它会执行一些步骤,这些步骤涉及在提供程序中“移动”消息。首先,它被写入队列,然后移动到发件箱,最后到发送的框(如果成功)。提供商通过更改邮件type
列的值来执行此操作,并且每次发生时,您的观察者onChange()
方法都会触发。由于发布的代码仅查询已发送的消息,前两次onChange()
触发,将返回先前发送的消息,而不是当前消息,因为当前消息将type
6
,然后4
进行前两次“移动”。
解决方案是通过传递null来更改查询以省略selection
,这将导致返回的Cursor
中的第一条消息成为最后更新的消息。然后,我们检查type
列的值为2
,表明邮件已成功发送,然后我们可以根据需要进行处理。
答案 1 :(得分:0)
决定使用:
Cursor cur = mCtx.getContentResolver().query(uriSMSURI, null, null,
null, "date DESC LIMIT 1");
String body = null;
if(cur.moveToFirst()){
String messageType = cur.getString(cur.getColumnIndexOrThrow("type")).toString();
if(messageType.equals("2")) { //2 == type sent
String type = cur.getString(cur.getColumnIndexOrThrow("type")).toString();
body = cur.getString(cur.getColumnIndexOrThrow("body")).toString();
Logger.d(body);
Logger.d(type);
}
}
cur.close();
感谢迈克的建议。