国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android監聽手機短信的示例代碼

2019-10-22 18:22:25
字體:
來源:轉載
供稿:網友

本文介紹了Android監聽手機短信的示例代碼,分享給大家,具體如下:

以下情況可能會導致短信攔截失敗:

  1. 小米,360等品牌手機攔截短信,短信的優先級給了系統
  2. 用戶禁用短信權限
  3. 手機連接電腦,被電腦端的手機助手類軟件截獲
  4. 手機內裝有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

  1. 優點:方便
  2. 缺點:耦合度高,復用性差

方式2:定義接口,Activity實現這個接口,拿到回調,處理業務邏輯

  1. 優點:耦合度低,復用性高
  2. 缺點沒用充分利用Handler資源

代碼如下:

/** * Created by wxw on 2016/9/24 10:34 * function: 監聽短信數據庫 * e-mail:wangxw725@163.com */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, 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:wangxw725@163.com */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"), projection,null, null, "_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方法()

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 都匀市| 隆化县| 榆林市| 澄江县| 香格里拉县| 尼木县| 禄丰县| 建阳市| 东乡县| 雷州市| 墨竹工卡县| 渝北区| 阳西县| 潢川县| 平邑县| 海盐县| 金坛市| 灵丘县| 盈江县| 太谷县| 陈巴尔虎旗| 安吉县| 平舆县| 万盛区| 惠水县| 图木舒克市| 大同县| 河东区| 孙吴县| 铜山县| 瑞金市| 开封县| 长泰县| 敦化市| 静安区| 永靖县| 岢岚县| 贵溪市| 三明市| 佛山市| 社旗县|