Android监听手机短信的示例代码

Android监听手机短信的示例代码,第1张

概述本文介绍了Android监听手机短信的示例代码,分享给大家,具体如下:以下情况可能会导致短信拦截失败:

本文介绍了AndroID监听手机短信的示例代码,分享给大家,具体如下:

以下情况可能会导致短信拦截失败:

小米,360等品牌手机拦截短信,短信的优先级给了系统 用户禁用短信权限 手机连接电脑,被电脑端的手机助手类软件截获 手机内装有QQ通讯录之类的管理联系人,短信的应用,被截获.

前提--权限:

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

定义短信广播接收者

public class SMSbroadcastReceiverextends broadcastReceiver{  private static OnReceivedMessageListener mOnReceivedMessageListener;  public static final String SMS_RECEIVED_ACTION = "androID.provIDer.Telephony.SMS_RECEIVED";  public SMSbroadcastReceiver(){    super();  }  @OverrIDe  public voID onReceive(Context context,Intent intent){    if (intent.getAction().equals(SMS_RECEIVED_ACTION)) {      Object[] pdus = (Object[]) intent.getExtras().get("pdus");      for(Object pdu:pdus) {        SmsMessage smsMessage = SmsMessage.createFromPdu((byte [])pdu);        String sender = smsMessage.getdisplayOriginatingAddress();        String content = smsMessage.getdisplayMessageBody();        long date = smsMessage.getTimestampMillis();        Date tIEmDate = new Date(date);        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");        String time = simpleDateFormat.format(tIEmDate);        //过滤不需要读取的短信的发送号码        if ("106902780116481".equals(sender)) {          mOnReceivedMessageListener.onReceived(getDynamicPassword(content));          abortbroadcast();        }      }    }  }  public interface OnReceivedMessageListener{    voID onReceived(String message);  }  public voID setonReceivedMessageListener(OnReceivedMessageListener onReceivedMessageListener){    this.mOnReceivedMessageListener = onReceivedMessageListener;  }  /**   * 从字符串中截取连续6位数字组合 ([0-9]{" + 6 + "})截取六位数字 进行前后断言不能出现数字 用于从短信中获取动态密码   * @param str 短信内容   * @return 截取得到的6位动态密码   */  public String getDynamicPassword(String str){    // 6是验证码的位数,一般为六位    Pattern continuousNumberPattern = Pattern.compile("(?<![0-9])([0-9]{" + 6 + "})(?![0-9])");    Matcher m = continuousNumberPattern.matcher(str);    String dynamicPassword = "";    while (m.find()) {      dynamicPassword = m.group();    }    return dynamicPassword;  }}

注册广播

SMSbroadcastReceiver = mSMSbroadcastReceiver = new SMSbroadcastReceiver();IntentFilter intentFilter = new IntentFilter(SMSbroadcastReceiver.SMS_RECEIVED_ACTION);intentFilter.setPriority(Integer.MAX_VALUE);this.registerReceiver(mSMSbroadcastReceiver,intentFilter);ToastManager.getInstance().showLongToast("注册短信监听");mSMSbroadcastReceiver.setonReceivedMessageListener(new SMSbroadcastReceiver.OnReceivedMessageListener() { @OverrIDe public voID onReceived(String message){ //do something }});

方式二:监听短信数据库

内容提供者中对外通信方式有3种:

方式1:定义为Activity的内部类,直接在onChang()方法中处理业务逻辑,比如收到短信之后设置给EditText

优点:方便 缺点:耦合度高,复用性差

方式2:定义接口,Activity实现这个接口,拿到回调,处理业务逻辑

优点:耦合度低,复用性高 缺点没用充分利用Handler资源

代码如下:

/** * Created by wxw on 2016/9/24 10:34 * function: 监听短信数据库 * e-mail:[email protected] */public class SmsContentObserverextends ContentObserver{  private Cursor cursor = null;  private Context mContext;  private String[] projection = new String[]{"_ID","body"};  private OnMessageObservedListener mOnMessageObservedListener;  public SmsContentObserver(Context context,Handler handler){    super(handler);    this.mContext = context;  }  public interface OnMessageObservedListener{    voID onObservedMessage(String message);  }  public voID setonMessageObservedListener(OnMessageObservedListener onMessageObservedListener){    this.mOnMessageObservedListener = onMessageObservedListener;  }  @OverrIDe  public voID onChange(boolean selfChange){    super.onChange(selfChange);    cursor = mContext.getContentResolver().query(Uri.parse("content://sms/inBox"),projection,null,"_ID desc");    if (cursor != null && cursor.getCount() > 0) {      cursor.movetoNext();      int smsbodyColumn = cursor.getColumnIndex("body");      String smsBody = cursor.getString(smsbodyColumn);      mOnMessageObservedListener.onObservedMessage(getDynamicPassword(smsBody));    }    cursor.close();  }  private String getDynamicPassword(String str){    Pattern continuousNumberPattern = Pattern.compile("(?<![0-9])([0-9]{" + 6 + "})(?![0-9])");    Matcher m = continuousNumberPattern.matcher(str);    String dynamicPassword = "";    while (m.find()) {      dynamicPassword = m.group();    }    return dynamicPassword;  }}

方式3:通过Handler发送消息,在Activity中进行业务逻辑处理

代码如下:

/** * Created by wxw on 2016/9/24 10:34 * function: 监听短信数据库 * e-mail:[email protected] */public class SmsContentObserverextends ContentObserver{  private Cursor cursor = null;  private Context mContext;  private Handler mHandler;  private String[] projection = new String[]{"_ID","body"};  public SmsContentObserver(Context context,Handler handler){    super(handler);    this.mContext = context;    this.mHandler = handler;  }  @OverrIDe  public voID onChange(boolean selfChange){    super.onChange(selfChange);    cursor = mContext.getContentResolver().query(Uri.parse("content://sms/inBox"),"_ID desc");    if (cursor != null && cursor.getCount() > 0) {      cursor.movetoNext();      int smsbodyColumn = cursor.getColumnIndex("body");      String smsBody = cursor.getString(smsbodyColumn);      mHandler.obtainMessage(1,getDynamicPassword(smsBody)).sendToTarget();    }    cursor.close();  }  private String getDynamicPassword(String str){    Pattern continuousNumberPattern = Pattern.compile("(?<![0-9])([0-9]{" + 6 + "})(?![0-9])");    Matcher m = continuousNumberPattern.matcher(str);    String dynamicPassword = "";    while (m.find()) {      dynamicPassword = m.group();    }    return dynamicPassword;  }}

注册观察者

smsContentObserver = new SmsContentObserver(this,smsHandler);getContentResolver().registerContentObserver(Uri.parse("content://sms/"),true,smsContentObserver);

handler中处理消息

private Handler smsHandler = new Handler(){ @OverrIDe public voID handleMessage(Message msg){ switch (msg.what){  case 0:  ......  break;  case 1:  LogUtils.x("Activity收到了短息码:"+(String)msg.obj);  lf.mEtPassword.setText((String)msg.obj);  break; } }};

注销观察者

@OverrIDeprotected voID onDestroy(){ super.onDestroy(); ...... if(smsContentObserver!=null){ getContentResolver().unregisterContentObserver(smsContentObserver); smsContentObserver = null; }}

遗留问题

观察者会多次回调onChang方法()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

总结

以上是内存溢出为你收集整理的Android监听手机短信的示例代码全部内容,希望文章能够帮你解决Android监听手机短信的示例代码所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1143581.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存