我的第一篇csdn博客文章,为了记录自己在Android领域的学习,同时也是为了以后忘记了查找方便。我是菜鸟,我只能以此方式来记忆。
实现的功能:
监听用户收到的验证码,可用于用户注册时或其他情形所收到的验证码自动填写到手机上。
一、新建一个类SmsObserver继承ContentObserver
/** * 第一步:SmsObser构造函数,调用时用 * 第二步:重写onChange方法 */
public class SmsObserver extends ContentObserver { private Context mContext; private Handler mHandler; /** * 第一步:构造函数 */ public SmsObserver(Context context, Handler handler) { super(handler); mContext = context; mHandler = handler; } /** * 第二步:重写onChange方法 * * @param selfChange * @param uri */ @Override public void onChange(boolean selfChange, Uri uri) { super.onChange(selfChange, uri); Log.d("TAG", "SMS has changed!"); Log.d("TAG", uri.toString()); //判断uri.toString()是否等于手机的短信库 if (uri.toString().equals("content://sms/raw")) { return; } Uri inboxuri = Uri.parse("content://sms/inbox"); Cursor cursor = mContext.getContentResolver().query(inboxuri,null,null,null,"date desc"); if(cursor!=null){ if(cursor.moveToFirst()){ String address = cursor.getString(cursor.getColumnIndex("address"));//发件人地址(手机号) String body = cursor.getString(cursor.getColumnIndex("body"));//信息内容 Log.d("TAG", "发件人为:" + address + " " + "短信内容为:" + body); Pattern pattern = Pattern.compile("(\\d{6})");//正则表达式,6位数字 Matcher matcher = pattern.matcher(body); if(matcher.find()){ String code = matcher.group(0); Log.d("TAG", "code is " + code); mHandler.obtainMessage(MainActivity.MSG_RECEIVER_CODE,code).sendToTarget(); } } cursor.close();//关闭游标 } } }二、MainActivity中调用
/** * 第一步:初始化ContentObserver * 第二步:注册ContentObserver * 第三步:重写onPause()方法,取消注册ContentObserver * 第四步:Handler接收code更新主线程 */ public class MainActivity extends AppCompatActivity { public static final int MSG_RECEIVER_CODE = 1; private EditText et_code = null; private SmsObserver mObserver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); et_code = (EditText) findViewById(R.id.et_code); mObserver = new SmsObserver(MainActivity.this,mHandler); Uri uri = Uri.parse("content://sms"); getContentResolver().registerContentObserver(uri,true,mObserver);//注册ContentObserver } @Override protected void onPause() { super.onPause(); getContentResolver().unregisterContentObserver(mObserver);//取消注册ContentObserver } private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); if(msg.what == MSG_RECEIVER_CODE){ String code = (String) msg.obj; Log.d("TAG",code); et_code.setText(code); } } }; }三、布局文件只加了一个EditText四、不要忘了在mainfest文件中加入权限<EditText android:id="@+id/et_code" android:layout_width="100dp" android:layout_height="wrap_content" android:text="验证码" android:layout_centerInParent="true"/>
<uses-permission android:name="android.permission.READ_SMS"/>终于写完了,累死了。