在進(jìn)行手機(jī)驗(yàn)證碼驗(yàn)證時(shí),為了提升用戶體驗(yàn),實(shí)現(xiàn)自動(dòng)截取驗(yàn)證填充的行式,實(shí)現(xiàn)這個(gè)功能有兩種方法,分別是利用android的廣播機(jī)制和android的ContentObserver 實(shí)現(xiàn)。
創(chuàng)新互聯(lián)建站主要從事成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)青羊,十余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220
第一種的實(shí)現(xiàn)方法如下:
/**
* 監(jiān)聽返回的驗(yàn)證碼信息,并自動(dòng)補(bǔ)充如驗(yàn)證碼輸入框中 [一級(jí)方法]
*/
public BroadcastReceiver getMessageReceive = new BroadcastReceiver() {
String address;
@Override
public void onReceive(Context context, Intent intent) {
Log.v(TAG+"--BroadcastReceiver --", "進(jìn)入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);
// 獲取短信的正文內(nèi)容
content = message.getMessageBody().trim();
// 獲取短信的發(fā)送者
address = message.getOriginatingAddress();
}
Log.v(TAG+"BroadcastReceiver address", "手機(jī)號(hào)=="
+ 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",
"驗(yàn)證碼==" + msgCode);
metVerify.setText(msgCode);
}
}
}
}
};
在activity 中的oncreate方法中,需要注冊(cè)這個(gè)廣播:
filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
getApplicationContext().registerReceiver(getMessageReceive, filter);
這樣,在接收到短信后,會(huì)發(fā)送廣播,然后進(jìn)行截取,但這個(gè)方法在android4.4后,部分手機(jī)就無法正常截取,因此推薦使用第二個(gè)方法。
第二個(gè)方法實(shí)現(xiàn)如下:
/**
* 監(jiān)聽短信數(shù)據(jù)庫(kù)
*/
class SmsContent extends ContentObserver {
private Cursor cursor = null;
public SmsContent(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
//讀取收件箱中指定號(hào)碼的短信
cursor = managedQuery(Uri.parse("content://sms/inbox"), new String[]{"_id", "address", "read", "body"},
" address=? and read=?", new String[]{"10658464", "0"}, "_id desc");//按id排序,如果按date排序的話,修改手機(jī)時(shí)間后,讀取的短信就不準(zhǔn)了
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的時(shí)候,不能主動(dòng)調(diào)用close()方法, 否則在Android 4.0+的系統(tǒng)上, 會(huì)發(fā)生崩潰
if(Build.VERSION.SDK_INT < 14) {
cursor.close();
}
}
}
種用內(nèi)容觀查者,在接收到短信后,發(fā)生變化時(shí),觸發(fā)onChange 方法。這種方法在測(cè)試的手機(jī)上均可攔截,故推薦大家使用這種方法,附demo 下載 :https://github.com/maliankun/intercept/archive/master.zip
文章標(biāo)題:android截取驗(yàn)證碼的兩種實(shí)現(xiàn)方式
文章位置:http://chinadenli.net/article34/jiipse.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、做網(wǎng)站、企業(yè)網(wǎng)站制作、虛擬主機(jī)、網(wǎng)站導(dǎo)航、定制開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)