/** * 短信验证码截取 ** @author yangfan **/public class SMSContentObserver extends ContentObserver{ private Context mContext; // 上下文 private Handler mHandler; // 更新UI线程 private String code; // 验证码 public SMSContentObserver(Context context, Handler handler) {super(handler);mContext = context;mHandler = handler; } /*** 回调函数, 当所监听的Uri发生改变时,就会回调此方法* * 注意当收到短信的时候会回调两次* * @param selfChange* 此值意义不大 一般情况下该回调值false*/ @Override public void onChange(boolean selfChange, Uri uri) {Log.e("XXXXXXXXXXXXXXXX", uri.toString());// 第一次回调 不是我们想要的 直接返回if (uri.toString().equals("content://sms/raw")){ 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 address = c.getString(c.getColumnIndex("address"));// 获取短信内容String body = c.getString(c.getColumnIndex("body"));// 判断手机号是否为目标号码if (!address.equals("你的目标号码")){ return;}// 正则表达式截取短信中的6位验证码Pattern pattern = Pattern.compile("(\d{6})");Matcher matcher = pattern.matcher(body);// 如果找到通过Handler发送给主线程if (matcher.find()){ code = matcher.group(0); mHandler.obtainMessage(1, code).sendToTarget();} }}c.close(); }}二、布局和Activity
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="50dp" > <TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="您的验证码为:" /> <EditTextandroid:id="@+id/smsCode"android:focusable="false"android:focusableInTouchMode="false"android:layout_width="match_parent"android:layout_height="wrap_content" /></LinearLayout>public class MainActivity extends ActionBarActivity{ private EditText code; @SuppressLint("HandlerLeak") Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg){ if (msg.what == 1) {code.setText(msg.obj.toString()); }} }; @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);code = (EditText) findViewById(R.id.smsCode);SMSContentObserver smsContentObserver = new SMSContentObserver(MainActivity.this, handler);MainActivity.this.getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, smsContentObserver); }}三、不要忘记加权限
自动获取短信验证码.png
代码地址:https://github.com/yungfan/SMSSMSContentObserver
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。