編輯:關於Android編程
概述
Android上實現短信驗證碼自動填寫,常用的有兩種方式。一種是利用BroadCastReceiver,還有一種是監聽手機上短信數據庫的變化。利用BroadCastReceiver來實現會在一些情況下無效,最常見的就是手機上安裝了具有垃圾短信攔截功能的軟件的情況下,短信驗證碼自動填寫無效。所以,現在一般會選用監聽數據庫內容變化的方式來實現短信驗證碼自動填寫。
網上對於利用監聽數據庫內容變化來實現短信驗證碼自動填寫的文章也很多,主要分為一下步驟:
1. 繼承ContentObserver實現一個短信數據庫的觀察者,再onChange。
2. 在Activity中注冊設個觀察者。
3. 在AndroidManifast文件中添加相關權限。
4. 別忘了再Activity的onDestory方法中取消注冊的觀察者。
經過驗證這種方式是可行的,而且比較好用。這種方法讀取短信的Cursor來源與Activity的managedQuery方法,這個方法已經被標記為廢棄,推薦用CursorLoader來代替。
CursorLoader的好處
首先,CursorLoader繼承的是AsyncTaskLoader,采用異步的方式查詢數據庫,避免了同步查詢阻塞UI線程的問題。它自己會監視數據源的變化並且會主動上報。而且,當發生配置上的變化,重新生成的loader會自動連接到變化前的cursor,在不使用查詢到的資源時,可以自動將其釋放。
短信驗證碼自動填寫的實現類
一言不合就直接貼代碼了:
package com.wuwang.demo; import android.content.ContentValues; import android.content.Context; import android.database.ContentObserver; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.util.Log; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * <p>Author : Wuwang </p> * <p>Company : ZhiJiaKeJi</p> * <p>Date :2016-07-21 09:16</p> * <p>Description : 驗證碼自動填充</p> */ public class VerificationCodeAutoFill implements LoaderManager.LoaderCallbacks<Cursor> { private Context context; private OnNewMessageListener listener; private String msgRegular; public VerificationCodeAutoFill(Context context){ this(context,null,null); } public VerificationCodeAutoFill(Context context,OnNewMessageListener listener){ this(context,listener,null); } /** * @param context * @param listener 新短信監聽 * @param msgRegular 對新短信處理的正則表達式,如果為空,則不進行處理 */ public VerificationCodeAutoFill(Context context, OnNewMessageListener listener,String msgRegular){ this.context=context; this.listener=listener; this.msgRegular=msgRegular; } public VerificationCodeAutoFill registerTo(int id,LoaderManager manager){ manager.initLoader(id,null,this); return this; } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { return new CursorLoader(context,Uri.parse("content://sms/inbox"), new String[] { "_id", "address", "read", "body" }, " read=?", new String[] {"0" }, "_id desc"); } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { // 按id排序,如果按date排序的話,修改手機時間後,讀取的短信就不准了 if (data != null && data.getCount() > 0) { ContentValues values = new ContentValues(); values.put("read", "1"); // 修改短信為已讀模式 data.moveToNext(); int smsbodyColumn = data.getColumnIndex("body"); String smsBody = data.getString(smsbodyColumn); Log.e("wuwang",smsBody); if(listener!=null){ listener.onNewMessage(getDynamicPassword(smsBody,msgRegular)); } } } @Override public void onLoaderReset(Loader<Cursor> loader) { } public interface OnNewMessageListener { void onNewMessage(String msg); } private String getDynamicPassword(String str,String regular) { if(regular==null)return str; Pattern continuousNumberPattern = Pattern.compile(msgRegular); Matcher m = continuousNumberPattern.matcher(str); String dynamicPassword = ""; while (m.find()) { System.out.print(m.group()); dynamicPassword = m.group(); } return dynamicPassword; } }
使用方法
使用比較簡單,直接再FragmengActivity中加上:
//匹配四位數字的短信驗證碼 new VerificationCodeAutoFill(this, new VerificationCodeAutoFill.OnNewMessageListener() { @Override public void onNewMessage(String msg) { //etMsg.setText(msg); //驗證碼填充 } }, "\\d{4}").registerTo(1,getSupportLoaderManager());
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持本站。
這個CardStackViewpager的靈感來自Github上面的 FlippableStackView開源項目,而我想實現的效果方向上恰好與FlippableStac
案例效果:模擬器上運行有些鋸齒,真機上和預期一樣好案例分析: 看效果,第一直覺肯定是Android原生態控件中沒有這樣的控件實現這種效果,自然想到應該需要自定義控件了,沒
如今,基於Android平台的應用越來越多,不乏這樣一些應用程序,這些應用可以多手機中的進程,內存和任務列表進行管理。Android系統中沒有自帶的應用程序對這些數據進行
頁面拖動到最後一頁 再向下滑動回復到 第一頁,第一頁向前滑動回到 最後一頁同時,底部紅色小圓點隨著頁面的滑動距離比例隨時改變位置布局:<?xml versi