很多項目中都會用到,自動擷取驗證碼填到輸入框,這樣使用者體驗比較好,廢話不多說,現在實作
用的是ContentObserver這個類,幫助我們來監聽短信資料庫發生的變化
package com.smart.android.activity;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.EditText;
import com.smart.android.R;
import com.smart.android.base.BaseActivity;
import com.smart.android.utils.SmsObserver;
/**
* @Title:
* @Description:
* @Author:leo
* @Since:
* @Version:
*/
public class ObtainMsgActivity extends BaseActivity {
public static final int MSG_RECEIVED_CODE = 1;
private EditText mEditText;
private SmsObserver mObserver;
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
if (msg.what == MSG_RECEIVED_CODE)
{
String code = (String)msg.obj;
mEditText.setText(code);
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_obtainmsg);
mEditText = (EditText)findViewById(R.id.et_msg);
mObserver = new SmsObserver(ObtainMsgActivity.this, mHandler);
Uri uri = Uri.parse("content://sms");
getContentResolver().registerContentObserver(uri, true, mObserver);
}
}
package com.smart.android.utils;
import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Handler;
import com.smart.android.activity.ObtainMsgActivity;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @Title:
* @Description:
* @Author:leo
* @Since:
* @Version:
*/
public class SmsObserver extends ContentObserver {
private Handler mHandler;
private Context mContext;
public SmsObserver(Context context,Handler handler) {
super(handler);
mContext = context;
mHandler = handler;
}
@Override
public void onChange(boolean selfChange, Uri uri) {
super.onChange(selfChange, uri);
String code;
if (uri.toString().equals("content://sms/raw")) onChange會執行二次,第二次短信才會入庫
{
return ;
}
Uri inboxUri = Uri.parse("content://sms/inbox");
Cursor c = mContext.getContentResolver().query(inboxUri, null, null, null, "date desc");
if (c != null) {
if (c.moveToFirst()) {
String body = c.getString(c.getColumnIndex("body"));//擷取短信内容
Pattern pattern = Pattern.compile("(\\d{6})");//正規表達式 連續6位數字
Matcher matcher = pattern.matcher(body);
if (matcher.find()) {
code = matcher.group(0);
mHandler.obtainMessage(ObtainMsgActivity.MSG_RECEIVED_CODE, code).sendToTarget();
}
}
c.close();
}
}
}