項目中提高體驗一般在短信驗證的時候會自動填充驗證碼,接下來我們就實現一把
界面就是這樣主要以實現邏輯為主

首先點擊驗證碼發一個定時器
這里用到CountDownTimer這個類完成定時器
點擊發送驗證碼隨機生成一個Radom數 Math.Radom()*9000+ 1000;
在這里花費我大量時間,但是對知識的渴求還是摸爬滾打讓我明白了問題,java和kotlit交互起來還是有問題嘛,表示踩坑很苦逼
/*thread { Runnable {
SystemClock.sleep(4000)
mCountDownTimer!!.ancleTimers()
} }.start()*/ 這里是調用的Kotlin的thread導致我想要的效果實現不了
Thread(Runnable {
SystemClock.sleep(4000)
mCountDownTimer!!.ancleTimers()
}).start()
寫到這里把倒計時的效果寫出來了,然后們看自動填寫短信內容是怎么回事,我們再梳理下邏輯
1.寫布局
2.用CountDownTImer做個定時器,里面兩個方法一個onTick,一個 onFinish()我是用接口回調自己封裝了當點擊開始,返回,取消,銷毀的操作,可以參考我寫的
3.真實項目時會用到網絡請求,把Radom的隨機數發到服務器,服務器做操作,最終發一個短信
4.最后就是我們要操作的短信內容里的數字信息了
我們用到內容觀察者來觀察數據發生變化,用內容提供都讀取信息填到TextView上
//自動獲取驗證碼實現步驟
public class SmsContent extends ContentObserver {
public static final String SMS_URI_INBOX = "content://sms/inbox";
private Activity activity = null;
private String smsContent = "";
private EditText verifyText = null;
public SmsContent(Activity activity, Handler handler,EditText verifyText) {
super(handler);
this.activity = activity;
this.verifyText = verifyText;
}
@SuppressWarnings("deprecation")
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
Cursor cursor = null;
// 讀取收件箱中指定號碼的未讀短信 ,按id排序,防止手機更改時間后讀取短信混亂
cursor = activity.managedQuery(Uri.parse(SMS_URI_INBOX),
new String[] { "_id", "address", "body", "read" },
"address=? and read=?", new String[] { "10690278071714", "0" },
"_id desc");
if (cursor != null) {// 如果短信為未讀模式
cursor.moveToFirst();
if (cursor.moveToFirst()) {
//將未讀改為已讀模式
ContentValues values = new ContentValues();
values.put("read", "1");
String smsbody = cursor.getString(cursor.getColumnIndex("body"));
System.out.println("smsbody=======================" + smsbody);
String regEx = "[^0-9]";
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(smsbody.toString());
//截取短信中的數字 個數為3
smsContent = m.replaceAll("").trim().toString().substring(0, 4);
verifyText.setText(smsContent);
}
}
}
}
在方法中調用剛寫的
// 自動獲取驗證碼,需要時調用下面兩行
content = new SmsContent(this, new Handler(), verifyCodeEForget);
// 注冊短信變化監聽
this.getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, content);
最后取消消毀內容提供者
@Override
protected void onDestroy() {
super.onDestroy();
this.getContentResolver().unregisterContentObserver(content);
}
記的加權限,必要時配置清單文件
<!--讀取短信-->
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.READ_SMS"/>
2.在上面的demo中有時候會出現點擊第二次才響應倒計時,暫時用這個代替

3.helloword倒計時是不是很酷,自定義的哦

