本文介紹了Android監聽手機短信的示例代碼,分享給大家,具體如下:
以下情況可能會導致短信攔截失敗:
前提--權限:
<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實現這個接口,拿到回調,處理業務邏輯
代碼如下:
/** * 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武林網。
新聞熱點
疑難解答