2

我知道这个问题已经很老了,可能是重复的,但我有一个基于它的特定查询,我仍在努力寻找解决方案。

据我所知,一旦数据发生变化,就会触发ContentObserveron URI 。content://sms我努力了,

https://katharnavas.wordpress.com/2012/01/18/listening-for-outgoing-sms-or-send-sms-in-android/

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

还有很多...

据我了解,这只能通过内容提供者来实现,并且没有广播来处理这个问题。也content://sms/sent不起作用

contentResolver.registerContentObserver(Uri.parse("content://sms/sent"), true, observer);

我正在接收onChange每个消息传递数据,无论其 SMS 发送、接收还是删除。因此,根据我使用https://developer.android.com/reference/android/provider/Telephony.TextBasedSmsColumns.html#MESSAGE_TYPE_SENT作为比较方法找到的 android 和其他 stackoverflow 链接的文档。

所以我的支票是这样的,

@Override
    public void onChange(boolean selfChange) {
        super.onChange(selfChange);
        Uri uriSMSURI = Uri.parse("content://sms");
        Cursor cur = getContentResolver().query(uriSMSURI, null, null, null, null);
        cur.moveToFirst();
        String id = cur.getString(cur.getColumnIndex("_id"));
        String protocol = cur.getString(cur.getColumnIndex("protocol"));
        Log.d(TAG, "protocol = " + protocol);
        int type = cur.getInt(cur.getColumnIndex("type"));
        Log.d(TAG, "onChange: type = " + type);
        // I have even tried with protocol == null check.
        if (type == 2 && smsChecker(id)) {
            Log.d(TAG, "Sent sms");
        }
        cur.close();
    }

    private boolean smsChecker(String smsId) {
        boolean flagSMS = true;

        if (smsId.equals(lastSmsId)) {
            flagSMS = false;
        }
        else {
            lastSmsId = smsId;
        }

        return flagSMS;
    }

所以我的问题是,如果我删除任何消息或触发传出消息,我会在我的 HTC 手机上收到类型 2 - L OS(有时对于传入消息,我也会看到 type==2)。

我如何分离这个 onChange 请求,因为我特别在寻找 SMS SENT 更改。

4

0 回答 0