最近作的項目裏要監聽手機的短消息內容,這個東西好像在最初學的時候都作過,不過如今早忘記了,如今寫下來,記住了。java
前提--權限:android
<uses-permission android:name="android.permission.RECEIVE_SMS" > </uses-permission> <uses-permission android:name="android.permission.READ_SMS" > </uses-permission>
方式一:經過廣播監聽短信消息數據庫
(注意:這種方式只對新收到的短消息有效,運行代碼,並不會讀取收件箱中已讀或未讀的消息,只有當收到新來的短消息時,纔會執行onChange方法)安全
註冊一個廣播:app
<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.javaide
public class SmsReciver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Bundle bundle = intent.getExtras(); SmsMessage msg = null; if (null != bundle) { Object[] smsObj = (Object[]) bundle.get("pdus"); for (Object object : smsObj) { msg = SmsMessage.createFromPdu((byte[]) object); Date date = new Date(msg.getTimestampMillis());//時間 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String receiveTime = format.format(date); System.out.println("number:" + msg.getOriginatingAddress() + " body:" + msg.getDisplayMessageBody() + " time:" + msg.getTimestampMillis()); //在這裏寫本身的邏輯 if (msg.getOriginatingAddress().equals("10086")) { //TODO } } } } }
系統的這個廣播是有序廣播,就是當別的程序先獲取到了這個廣播再傳遞給你,固然它也能夠幹掉這個廣播,讓你接收不到,這樣你的程序確定是接收不到這個廣播的了。咱們發現,經過設置priority的數值,其實有時是無論用的,如今在一些定製的系統或是有安全軟件的狀況下,每每短消息都被截取到,並被幹掉。
this
那麼,咱們只能使用方法二,監聽短信數據庫的變化,這種方式比方法一稍微複雜一些,不過使用起來也很方便,不受其它程序干擾~spa
方式二:經過短信數據庫獲取短信內容線程
(注意:這種方式能夠獲取手機上全部的短信,包括已讀未讀的短信,是否是很贊)code
private Uri SMS_INBOX = Uri.parse("content://sms/"); public void getSmsFromPhone() { ContentResolver cr = getContentResolver(); String[] projection = new String[] { "body" };//"_id", "address", "person",, "date", "type String where = " address = '1066321332' AND date > " + (System.currentTimeMillis() - 10 * 60 * 1000); Cursor cur = cr.query(SMS_INBOX, projection, where, null, "date desc"); if (null == cur) return; if (cur.moveToNext()) { String number = cur.getString(cur.getColumnIndex("address"));//手機號 String name = cur.getString(cur.getColumnIndex("person"));//聯繫人姓名列表 String body = cur.getString(cur.getColumnIndex("body")); //這裏我是要獲取本身短信服務號碼中的驗證碼~~ Pattern pattern = Pattern.compile(" [a-zA-Z0-9]{10}"); Matcher matcher = pattern.matcher(body); if (matcher.find()) { String res = matcher.group().substring(1, 11); mobileText.setText(res); } } }
經過方式二,咱們就能獲取手機中全部的短消息了,但是還有一個問題,若是來了新的短消息呢?咱們總不能寫個線程,每隔多少秒,去讀取一下短信數據庫吧?其實咱們能夠把方式二換個方式寫:
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(); } }
效果: