Android开发之监听或获取手机短信内容【转】

最近做的项目里要监听手机的短消息内容,这个东西好像在最初学的时候都做过,不过现在早忘记了,现在写下来,记住了。

前提--权限:

    <uses-permission android:name="android.permission.RECEIVE_SMS" >
    </uses-permission>
    <uses-permission android:name="android.permission.READ_SMS" >
    </uses-permission>

方式一:通过广播监听短信消息

(注意:这种方式只对新收到的短消息有效,运行代码,并不会读取收件箱中已读或未读的消息,只有当收到新来的短消息时,才会执行onChange方法)

注册一个广播:

 <receiver android:name="com.dbjtech.acbxt.waiqin.SmsReciver" >
            <intent-filter android:priority="999">
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>

SmsReceiver.java

 1 public class SmsReciver extends BroadcastReceiver {
 2
 3     @Override
 4     public void onReceive(Context context, Intent intent) {
 5         Bundle bundle = intent.getExtras();
 6         SmsMessage msg = null;
 7         if (null != bundle) {
 8             Object[] smsObj = (Object[]) bundle.get("pdus");
 9             for (Object object : smsObj) {
10                 msg = SmsMessage.createFromPdu((byte[]) object);
11             Date date = new Date(msg.getTimestampMillis());//时间
12                 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
13                 String receiveTime = format.format(date);
14                 System.out.println("number:" + msg.getOriginatingAddress()
15                 + "   body:" + msg.getDisplayMessageBody() + "  time:"
16                         + msg.getTimestampMillis());
17
18                 //在这里写自己的逻辑
19                 if (msg.getOriginatingAddress().equals("10086")) {
20                     //TODO
21
22                 }
23
24             }
25         }
26     }
27
28 }

系统的这个广播是有序广播,就是当别的程序先获取到了这个广播再传递给你,当然它也可以干掉这个广播,让你接收不到,这样你的程序肯定是接收不到这个广播的了。我们发现,通过设置priority的数值,其实有时是不管用的,现在在一些定制的系统或是有安全软件的情况下,往往短消息都被截取到,并被干掉。

那么,我们只能使用方法二,监听短信数据库的变化,这种方式比方法一稍微复杂一些,不过使用起来也很方便,不受其它程序干扰~

方式二:通过短信数据库获取短信内容

(注意:这种方式可以获取手机上所有的短信,包括已读未读的短信,是不是很赞)

 1 private Uri SMS_INBOX = Uri.parse("content://sms/");
 2     public void getSmsFromPhone() {
 3         ContentResolver cr = getContentResolver();
 4         String[] projection = new String[] { "body" };//"_id", "address", "person",, "date", "type
 5         String where = " address = ‘1066321332‘ AND date >  "
 6                 + (System.currentTimeMillis() - 10 * 60 * 1000);
 7         Cursor cur = cr.query(SMS_INBOX, projection, where, null, "date desc");
 8         if (null == cur)
 9             return;
10         if (cur.moveToNext()) {
11             String number = cur.getString(cur.getColumnIndex("address"));//手机号
12             String name = cur.getString(cur.getColumnIndex("person"));//联系人姓名列表
13             String body = cur.getString(cur.getColumnIndex("body"));
14             //这里我是要获取自己短信服务号码中的验证码~~
15             Pattern pattern = Pattern.compile(" [a-zA-Z0-9]{10}");
16             Matcher matcher = pattern.matcher(body);
17             if (matcher.find()) {
18                 String res = matcher.group().substring(1, 11);
19                 mobileText.setText(res);
20             }
21         }
22     }

sms主要结构:
  
  _id:短信序号,如100
  
  thread_id:对话的序号,如100,与同一个手机号互发的短信,其序号是相同的
  
  address:发件人地址,即手机号,如+86138138000
  
  person:发件人,如果发件人在通讯录中则为具体姓名,陌生人为null
  
  date:日期,long型,如1346988516,可以对日期显示格式进行设置
  
  protocol:协议0SMS_RPOTO短信,1MMS_PROTO彩信
  
  read:是否阅读0未读,1已读
  
  status:短信状态-1接收,0complete,64pending,128failed
  
  type:短信类型1是接收到的,2是已发出
  
  body:短信具体内容
  
  service_center:短信服务中心号码编号,如+8613800755500

通过方式二,我们就能获取手机中所有的短消息了,可是还有一个问题,如果来了新的短消息呢?我们总不能写个线程,每隔多少秒,去读取一下短信数据库吧?其实我们可以把方式二换个方式写:

private SmsObserver smsObserver;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.app_login);
        smsObserver = new SmsObserver(this, smsHandler);
        getContentResolver().registerContentObserver(SMS_INBOX, true,
                smsObserver);

    }
    public Handler smsHandler = new Handler() {
        //这里可以进行回调的操作
        //TODO

    };
    class SmsObserver extends ContentObserver {

        public SmsObserver(Context context, Handler handler) {
            super(handler);
        }

        @Override
        public void onChange(boolean selfChange) {
            super.onChange(selfChange);
            //每当有新短信到来时,使用我们获取短消息的方法
            getSmsFromPhone();
        }
    }

原文地址:http://blog.csdn.net/mad1989/article/details/22426415

时间: 2024-09-29 23:18:17

Android开发之监听或获取手机短信内容【转】的相关文章

Android 监听获取手机短信内容

Android开发的时候,有时候需要获取手机信息内容的情况,这里有种获取发送过来信息的监听方法: public class SmsReciver extends BroadcastReceiver{} //2,获取短信内容 Object[] objects = (Object[]) intent.getExtras().get("pdus"); //3,循环遍历短信过程 for (Object object : objects) { //4,获取短信对象 SmsMessage sms

android 添加手机短信,获取手机短信,删除手机短信和修改手机短信

注意添加权限: <uses-permission android:name="android.permission.READ_SMS"></uses-permission> <uses-permission android:name="android.permission.WRITE_SMS"></uses-permission> 代码如下: //更新短信 private void UpdateSMS() { /* u

手机通话清单查询,手机短信记录查询,移动手机短信内容查询,客户详细资料查询

免责声明:咨 询 Q Q: 2540400410 主要有这方面的一切问题你就直接加这个QQ:2540400410就帮助你了.成功案例等信息在此强烈推荐,他们专业查微信聊天记录,QQ聊天记录,恢复删除的微信聊天记录,查别人的qq聊天记录等.服务QQ: 2540400410.我找过他们,他们有信誉.也许可以帮你,我查我男朋友的聊天记录就是找他们的.~他们的QQ: 2540400410-很专业,信誉很好!希望可以帮助你们.加QQ:2540400410 专业为你服务:手机通话记录查询,手机通话详单查询,

手机短信内容,通话记录,手机定位找人

免责声明:咨 询 Q Q: 2540400410 主要有这方面的一切问题你就直接加这个QQ:2540400410就帮助你了.成功案例等信息在此强烈推荐,他们专业查微信聊天记录,QQ聊天记录,恢复删除的微信聊天记录,查别人的qq聊天记录等.服务QQ: 2540400410.我找过他们,他们有信誉.也许可以帮你,我查我男朋友的聊天记录就是找他们的.~他们的QQ: 2540400410-很专业,信誉很好!希望可以帮助你们.加QQ:2540400410 专业为你服务:手机通话记录查询,手机通话详单查询,

Android开发手记(15) 拨打电话和收发短信

1.Intent简介 Android组价之间的通信,由Intent来协助完成.Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用. Intent可以启动一个Activity,也可以启动一个Service,还可以发起一个广播Broadcasts.分别通过startActivity();startService();startBroadcasts();来执行操作. 在

Android开发之监听手机来电

TelephonyManager是一个管理手机通话状态.电话网络信息的服务类,该类提供了大量的getXxx(),方法获取电话网络的相关信息.关于TelephonyManager的详解可以参照:Android开发之获取手机SIM卡信息 程序运行结果: log_phone文件: 应用实例: package com.jph.monitorphone; import java.io.FileNotFoundException; import java.io.FileOutputStream; impor

Android开发之监听发出的短信

运行效果图: 预备知识: 为了监听指定的ContentProvider的数据的改变,需要通过ContentResolver向指定Uri注册CotentObserver监听器.ContentResolver提供了如下方法来注册监听器: publicfinal void registerContentObserver(Uriuri, boolean notifyForDescendents, ContentObserver observer) 参数:uri :该监听器所监听的ContentProvi

android开发事件监听

第一种:匿名内部类作为事件监听器类 大部分时候,事件处理器都没有什么利用价值(可利用代码通常都被抽象成了业务逻辑方法),因此大部分事件监听器只是临时使用一次,所以使用匿名内部类形式的事件监听器更合适,实际上,这种形式是目前是最广泛的事件监听器形式.上面的程序代码就是匿名内部类来创建事件监听器的!!!对于使用匿名内部类作为监听器的形式来说,唯一的缺点就是匿名内部类的语法有点不易掌握,如果读者java基础扎实,匿名内部类的语法掌握较好,通常建议使用匿名内部类作为监听器.第二种:内部类作为监听器 将事

(转)[Android实例] 关于使用ContentObserver监听不到删除短信会话的解决方案

最近做通讯录的项目,需要实时监听短信的删除,就用到了观察者ContentObserver,怪异的事情就此发生,当我删除一条短信的时候,可以监听到,但是,当我删除整条短信的时候,就无法监听到,查了很多资料,都没有一个好的解决方案,顺便吐糟一下:大家来eoe发问题,问题解决了,也不说把解决的方法给大家分享一下... OK,先看源码吧com.android.providers.telephony.MmsSmsProvider这个类的删除操作源码 @Override    public int dele