public class SmsContentObserver extends ContentObserver { private Context mContext; private Handler mHandler;//更新UI线程 private String code; private int number; public SmsContentObserver(Handler handler, Context context,int number) { super(handler); this.mContext = context; this.mHandler = handler; this.number = number; } @Override public void onChange(boolean selfChange, Uri uri) { 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; } Pattern pattern = Pattern.compile("(\\d{" + number + "})"); Matcher matcher = pattern.matcher(body); if (matcher.find()) { code = matcher.group(0); mHandler.obtainMessage(1, code).sendToTarget(); } } } c.close(); } }需要在AndroidManifest.xml文件中添加如下权限<uses-permission android:name="android.permission.READ_SMS"/><uses-permission android:name="android.permission.READ_CONTACTS"/>接下来就可以在我们的activity中使用了点击获取验证码按钮时需要先请求权限,如果相应的权限被允许则可以使用自动填充验证码功能,如果权限不被允许则不能使用自动填充验证码的功能requestRunntimePermission(new String[]{Manifest.permission.READ_SMS}, new PermissionListener() { @Override public void granted() { smsContentObserver = new SmsContentObserver(handler1, LoginPwdActivity.this, 4); LoginPwdActivity.this.getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, smsContentObserver); } @Override public void denied(List<String> deniedList) { } });Handler handler1 = new Handler() { @Override public void handleMessage(Message msg) { if (msg.what == 1) { aQuery.id(R.id.id_edt_code_loginpwd).getEditText().setText("");//将从短信中获取到的验证码填写到指定的控件上
aQuery.id(R.id.id_edt_code_loginpwd).getEditText().setText(msg.obj.toString()); } }};其中requestRunntimePermission()方法是我自己封装的用于判断相应的权限是否被允许,如果没被允许给用户权限申请弹窗private static PermissionListener mListener;
public static void requestRunntimePermission(String[] permissionList, PermissionListener listener) { Activity topActivity = ActivityCollector.getTopActivity(); if (topActivity == null) { return; } mListener = listener; List<String> permissionDenieds = new ArrayList<>(); for (String permission : permissionList) { if (ContextCompat.checkSelfPermission(topActivity, permission) != PackageManager.PERMISSION_GRANTED) { permissionDenieds.add(permission); } } if (!permissionDenieds.isEmpty()) { ActivityCompat.requestPermissions(topActivity, permissionDenieds.toArray(new String[permissionDenieds.size()]), 1); } else { mListener.granted(); } }
@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case 1: if (grantResults.length > 0) { List<String> deniedPermissionList = new ArrayList<>(); for (int i = 0; i < grantResults.length; i++) { int grantResult = grantResults[i]; String permission = permissions[i]; if (grantResult != PackageManager.PERMISSION_GRANTED) { deniedPermissionList.add(permission); } } if (deniedPermissionList.isEmpty()) { mListener.granted(); } else { mListener.denied(deniedPermissionList); } } } }ActivityCollector类如下:public class ActivityCollector { private static List<Activity> activityList = new ArrayList<>(); public static void addActivity(Activity activity) { activityList.add(activity); } public static void removeActivity(Activity activity) { activityList.remove(activity); } /** * 获取栈顶activity */ public static Activity getTopActivity() { if (activityList.isEmpty()) { return null; } else { return activityList.get(activityList.size() - 1); } } }PermissionListener接口如下:public interface PermissionListener { void granted(); void denied(List<String> deniedList); }
android app 自动填写短信验证码
最新推荐文章于 2022-06-24 21:58:15 发布