手机收到验证码短信后,程序自动识别验证码并填充验证码输入框。android
思路是有了,实现的方式也有多种:数据库
一、开启一个线程,隔一段时间就去查询收件箱是否有变化,有变化再读取出来作处理。ide
二、注册一个短信变化的广播,收到广播后再去读取出来作处理。this
三、经过ContentObserver(内容观察者)来捕获特定Uri的变化。spa
方案1,显然不能够取,太耗资源。线程
方案2,实际应用起来是会有问题的,由于短信的广播是有序广播,假若有其余应用先捕获广播并终止传递,那么咱们就永远也收不到这条短信变化的广播了。code
因此,综合比较起来,方案3比较可取。通过笔者实践也是没有问题的。server
先来点介绍性文字吧。blog
“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 + "\n" + "短信内容: " + 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 }