灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2826回复:0

Android中短信监听的各种问题,实现监听短信的功能

楼主#
更多 发布于:2012-09-06 13:46

写一个短信监听程序,大家很容易想到的就是注册一个广播接收器,来接收系统收到短信时候的广播。可是这个广播是有序广播,就是当别的程序先获取到了这个广播再传递给你,当然它也可以干掉这个广播,让你接收不到,这样你的程序肯定是接收不到这个广播的了。网上有很多这样的例子,什么提高广播接收器的优先级又是1000又是10000的。。


这里提到了把intent-filter中的Android:priority的值设置为1000,但是在实时中你设置1000一样是接受不到广播的,除非你把手机中的其他接受了这个广播的短信卸载,比如360 GO短信,飞信神马的。他们的优先级总是要比你的高。你可以继续BAIDU,有的人会设置它为10000 9999等等,你会发现设置为10000的时候偶尔可以接收到,仅仅是偶尔。那肿么办呢。
我下面用的方法不是去接收系统广播,而是去监听短信数据库的变化,当收到短信数据库变化了的时候,去取得最新的那条短信即可。或者你想别的什么操作也可以。
监听类SmsReceiver.java

[java]
package com.pei.broadcastReceiver;

import java.util.List;

import com.pei.fixed.AllFinalInfo;
import com.pei.info.SmsInfo;
import com.pei.util.SmsContent;

import Android.app.Activity;
import Android.database.ContentObserver;
import Android.net.Uri;
import Android.os.Handler;

/**
* class name:SmsReceiver<BR>
* class description:数据库改变监听类<BR>
* PS:当数据改变的时候,执行里面才change方法<BR>
* Date:2012-3-16<BR>
*
* @version 1.00
* @author CODYY)peijiangping
*/
public class SmsReceiver extends ContentObserver {
    /**
     * Activity对象
     */
    private Activity activity;
    private List<SmsInfo> infos;

    public SmsReceiver(Handler handler, Activity activity) {
        super(handler);
        this.activity = activity;
    }

    @Override
    public void onChange(boolean selfChange) {
        Uri uri = Uri.parse(AllFinalInfo.SMS_URI_INBOX);// 设置一个uri来查看各种类别短信内容
        SmsContent smscontent = new SmsContent(activity, uri);
        infos = smscontent.getSmsInfo();
        System.out.println(infos.get(1).getSmsbody());
        super.onChange(selfChange);
    }
}
怎么注册这个监听呢,只需:
[java]
ContentObserver co = new SmsReceiver(new Handler(),
                AndroidUtilActivity.this);
        this.getContentResolver().registerContentObserver(
                Uri.parse("content://sms/"), true, co);


喜欢0 评分0
游客

返回顶部