Android:如何只在收件箱中获取最后发送的短信?

时间:2016-01-10 10:49:58

标签: android sms android-contentprovider android-cursor

尝试使用这种方式从内容提供商处获取最后一条短信。

@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: ╚════════════════════════════════════════════════════════════════════════════════════════

2 个答案:

答案 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();

感谢迈克的建议。