微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – Sms ContentObserver onChange()多次触发

我知道这个问题已被多次询问,但没有人能够从我所看到的那里得到一个有效的答案.

我正在开发一个应用程序拦截短信,并根据发送#,弹出一个自定义提醒.我使用广播接收器可以很好地工作,但是如果用户安装了goSms,则永远不会调用onReceive()方法,因为goSms在到达我的应用程序之前就会中止它.

为了解决这个问题,我在内容上尝试了内容观察者:// sms /
它的工作正常,但onChange()被调用两次,参数完全相同.我曾尝试检查时间戳,但它们是相同的,我设置的类型和其他参数也是如此.

从我所看到的情况来看,这是一个常见的问题,但不是我见过的任何一个问题.

@Override
public void onChange(boolean selfChange) {
    super.onChange(selfChange);
    querySMS();
}

protected void querySMS() {
    Cursor cur = getContentResolver().query(u,null,null);
    cur.movetoNext(); // this will make it point to the first record,which is the last SMS sent
    String type = cur.getString(cur.getColumnIndex("type"));
    String body = cur.getString(cur.getColumnIndex("body")); //content of sms
    String add = cur.getString(cur.getColumnIndex("address")); //phone num
    if (type.equals("1")) {
        if (add.equals(Test.SENDER)) {              
            String[] bodys = body.split(" ",7);
            if (bodys[0].equals("test")) {
                test = true;
            }
            cat = bodys[1];
            level = bodys[2];
            urgency = bodys[3];
            certainty = bodys[4];
            carrier = bodys[5];
            message = bodys[6];
            final Intent intent = new Intent(context,AlertActivity.class);
            Bundle b = new Bundle();
            b.putString("title",cat);
            b.putString("certainty",certainty);
            b.putString("urgency",urgency);
            b.putString("level",level);
            b.putString("message",message);
            b.putBoolean("test",test);
            intent.putExtras(b);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            TelephonyManager manager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
            carrierName = manager.getNetworkOperatorName();
            if (carrierName.replaceAll(" ","").equals(carrier)) {

                context.startActivity(intent);
            } else {
                //testing
                Toast.makeText(context,carrierName.replaceAll(" ",""),Toast.LENGTH_LONG).show();
            }
        }
    }
}

由于onChange()被触发两次,我也得到两个警报.我无法为我的生活找到解决这个问题的方法.

解决方法

如果两者相同:
存储收到的每条消息
将它与之前收到的消息进行比较
如果没有找到,请处理
如果找到,请丢弃该消息

存储的消息的生命周期应该是无穷小的,5个消息的小循环缓冲区应该没问题.

原文地址:https://www.jb51.cc/java/130032.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐