標籤:android 驗證碼 address equals public
在進行手機驗證碼驗證時,為了提升使用者體驗,實現自動截取驗證填充的行式,實現這個功能有兩種方法,分別是利用android的廣播機制和android的ContentObserver 實現。
第一種的實現方法如下:
/**
* 監聽返回的驗證碼資訊,並自動補充如驗證碼輸入框中 [一級方法]
*/
public BroadcastReceiver getMessageReceive = new BroadcastReceiver() {
String address;
@Override
public void onReceive(Context context, Intent intent) {
Log.v(TAG+"--BroadcastReceiver --", "進入onReceive");
String msgCode = null;
if (intent.getAction().equals(
"android.provider.Telephony.SMS_RECEIVED")) {
Bundle bundle = intent.getExtras();
if (bundle != null) {
Object[] pdus = (Object[]) intent.getExtras().get("pdus");
for (Object pdu : pdus) {
SmsMessage message = SmsMessage
.createFromPdu((byte[]) pdu);
// 擷取簡訊的本文內容
content = message.getMessageBody().trim();
// 擷取簡訊的寄件者
address = message.getOriginatingAddress();
}
Log.v(TAG+"BroadcastReceiver address", "手機號=="
+ address);
if (address != null && address.equals("10658464")) {
String regex = "\\d*";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(content);
while (m.find()) {
if (m.group().length() == 6) {
msgCode = m.group();
}
}
Log.v(TAG+" BroadcastReceiver msgCode",
"驗證碼==" + msgCode);
metVerify.setText(msgCode);
}
}
}
}
};
在activity 中的oncreate方法中,需要註冊這個廣播:
filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
getApplicationContext().registerReceiver(getMessageReceive, filter);
這樣,在接收到簡訊後,會發送廣播,然後進行截取,但這個方法在android4.4後,部分手機就無法正常截取,因此推薦使用第二個方法。
第二個方法實現如下:
/**
* 監聽簡訊資料庫
*/
class SmsContent extends ContentObserver {
private Cursor cursor = null;
public SmsContent(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
//讀取收件匣中指定號碼的簡訊
cursor = managedQuery(Uri.parse("content://sms/inbox"), new String[]{"_id", "address", "read", "body"},
" address=? and read=?", new String[]{"10658464", "0"}, "_id desc");//按id排序,如果按date排序的話,修改手機時間後,讀取的簡訊就不準了
if (cursor != null && cursor.getCount() > 0) {
ContentValues values = new ContentValues();
values.put("read", "1"); //修改簡訊為已讀模式
cursor.moveToNext();
int smsbodyColumn = cursor.getColumnIndex("body");
String smsBody = cursor.getString(smsbodyColumn);
ed_mmscode.setText(getDynamicPassword(smsBody));
}
//在用managedQuery的時候,不能主動調用close()方法, 否則在Android 4.0+的系統上, 會發生崩潰
if(Build.VERSION.SDK_INT < 14) {
cursor.close();
}
}
}
種用內容觀查者,在接收到簡訊後,發生變化時,觸發onChange 方法。這種方法在測試的手機上均可攔截,故推薦大家使用這種方法,附demo 下載 :https://github.com/maliankun/intercept/archive/master.zip
android 截取驗證碼的兩種實現方式