手机收到验证码短信后,程序自动识别验证码并填充验证码输入框。
思路是有了,实现的方式也有多种:
1、开启一个线程,隔一段时间就去查询收件箱是否有变化,有变化再读取出来做处理。
2、注册一个短信变化的广播,收到广播后再去读取出来做处理。
3、通过ContentObserver(内容观察者)来捕获特定Uri的变化。
方案1,显然不可以取,太耗资源。
方案2,实际应用起来是会有问题的,因为短信的广播是有序广播,假如有其他应用先捕获广播并终止传递,那么我们就永远也收不到这条短信变化的广播了。
所以,综合比较起来,方案3比较可取。经过笔者实践也是没有问题的。
先来点介绍性文字吧。
“ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它。触发器分为表触发器、行触发器,相应地ContentObserver也分为“表“ContentObserver、“行”ContentObserver,当然这是与它所监听的Uri MIME Type有关的。”
下面给出方案3的关键性代码:
1 public class SmsObserver extends ContentObserver{
2
3 private Context mContext;
4 private Handler mHandler;
5
6 public SmsObserver(Context context,Handler handler) {
7 super(handler);
8 this.mContext = context;
9 this.mHandler = handler;
10 }
11
12 @Override
13 public void onChange(boolean selfChange) {
14 super.onChange(selfChange);
15
16 String code = "";
17
18 Uri inBoxUri = Uri.parse("content://sms/inbox");
19 Cursor c = mContext.getContentResolver().query(inBoxUri,null,null,null,"date desc");
20
21 if(c != null){
22 if(c.moveToFirst()){
23 String address = c.getString(c.getColumnIndex("address"));
24 String body = c.getString(c.getColumnIndex("body"));
25 Log.i("TAG","发件人为: " + address + "
" + "短信内容: " + body);
26
27 //这里可以写某个电话
28 // if(!address.equals("+8615210091283")){
29 // return;
30 // }
31
32 Pattern pattern = Pattern.compile("\d{6}");
33 Matcher matcher = pattern.matcher(body);
34
35 if(matcher.find()){
36 code = matcher.group(0);
37 mHandler.obtainMessage(MainActivity.MSG_RECEIVED_CODE,code).sendToTarget();
38 }
39 }
40 c.close();
41 }
42 }
43 }
1 public class MainActivity extends Activity {
2
3 private SmsObserver mObserver;
4 private EditText mEtReceive;
5 public static final int MSG_RECEIVED_CODE = 1;
6
7 private Handler mHandler = new Handler(){
8 public void handleMessage(android.os.Message msg) {
9 if(msg.what == MSG_RECEIVED_CODE){
10 String code = (String)msg.obj;
11 mEtReceive.setText(code);
12 }
13 };
14 };
15 private Uri uri;
16
17
18
19 @Override
20 protected void onCreate(Bundle savedInstanceState) {
21 super.onCreate(savedInstanceState);
22 setContentView(R.layout.activity_main);
23
24 mEtReceive = (EditText)findViewById(R.id.et_receive);
25
26 mObserver = new SmsObserver(MainActivity.this,mHandler);
27 uri = Uri.parse("content://sms");
28 getContentResolver().registerContentObserver(uri,true,mObserver);
29 }
30
31 @Override
32 protected void onPause() {
33 super.onPause();
34 getContentResolver().unregisterContentObserver(mObserver);
35 }
36
37 @Override
38 protected void onResume() {
39 super.onResume();
40 getContentResolver().registerContentObserver(uri,true,mObserver);
41 }
42 }