現在用短信驗證碼來實現登錄和註冊功能已經越來越常見了。如果你想用戶在收到短信驗證碼後,不需要再手動輸入進去的話,而是自動填入,那麼你就需要做些特殊處理了!
1.監聽短信變化
首先需要的是通過ContentObserver類中的OnChange()監聽你的短信變化。簡單的介紹下ContentObserver:內容觀察者,目的是觀察(捕捉)特定Uri引起的數據庫的變化,繼而做一些相應的處理。
2.獲取驗證碼
檢測到了短信變化後,讀取該條短信的內容,並且通過正則表達式來獲取內容中的驗證碼。
3.修改UI
ContentObserver構造方法中有一個handler,通過handler來修改主線程中ui內容,將接收到的驗證碼呈現在ui上。
貼上代碼,代碼中有註釋講解:
MainActivity.java
import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView mSmsTV;
private SmsObserver mSmsObserver;
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(msg.what == 1) {
String code = (String) msg.obj;
mSmsTV.setText(code);
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSmsTV = (TextView) findViewById(R.id.tv_sms);
mSmsObserver = new SmsObserver(this, mHandler);
Uri smsUri = Uri.parse("content://sms");
getContentResolver().registerContentObserver(smsUri, true, mSmsObserver);//註冊短信uri的監聽
}
@Override
protected void onPause() {
super.onPause();
getContentResolver().unregisterContentObserver(mSmsObserver);//取消監聽
}
}
SmsObserver.java
import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class SmsObserver extends ContentObserver {
private Context mContext;
private Handler mHandler;//更新ui
public SmsObserver(Context context, Handler handler) {
super(handler);
mContext = context;
mHandler = handler;
}
@Override
public void onChange(boolean selfChange, Uri uri) {
super.onChange(selfChange, uri);
/* 收到一條短信,onChange()會執行兩次,uri不同 */
if (uri.toString().equals("content://sms/raw")) {//未寫入數據庫,不進行任何操作
return;
} else {//此時已經寫入數據庫
Uri inboxUri = Uri.parse("content://sms/inbox");
/* 按照日期倒序排序 */
Cursor cursor = mContext.getContentResolver().query(inboxUri, null, null, null, "date desc");
if (cursor != null) {
if (cursor.moveToFirst()) {//遊標移動到first位置
/* 發件人的號碼 */
String address = cursor.getString(cursor.getColumnIndex("address"));
/* 短信內容 */
String body = cursor.getString(cursor.getColumnIndex("body"));
Log.i("wyk", "address:" + address + ",body:" + body);
/* 利用正則提取驗證碼(根據實際情況修改) */
Pattern pattern = Pattern.compile("(\\d{6})");//提取六位數字
Matcher matcher = pattern.matcher(body);//進行匹配
if(matcher.find()){//匹配成功
String code = matcher.group(0);
Message msg = mHandler.obtainMessage(1, code);
mHandler.sendMessage(msg);
Log.i("wyk","code:"+code);
}
}
cursor.close();
}
}
}
}
最後別忘了再manifest中加入讀取短信的權限
<uses-permission android:name="android.permission.READ_SMS"/>