• 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

  • 相关阅读:
    22.Collections排序
    21.Collections常用方法的使用
    20.ArrayList获取并打印新闻标题
    19. Set接口的一般用法
    JS脚本显示当前日期+星期几[转]
    java流下载
    技术书籍分类[转]
    Javascript 继承 call与prototype
    SpringMVC访问静态资源[转]
    获取调用者Class和method、反射获取get方法、获取注解信息
  • 原文地址:https://www.cnblogs.com/chenlong-50954265/p/4499458.html
Copyright © 2020-2023  润新知