需要实现如下效果:

首先定义一个SMSContentObserver 来拦截短信内容:

package “你的包名”;import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Handler;
import android.text.TextUtils;
import android.util.Log;import java.util.regex.Matcher;
import java.util.regex.Pattern;public class SMSContentObserver extends ContentObserver {private static String TAG = "SMSContentObserver";private String patternCoder = "\\d{4}";     //正则表达式 取4位数private String strContent;                  //验证码内容private Context mContext  ;private Handler mHandler ;                   //更新UI线程private String TELPHONE = "TMRTXMIN"; // 短信来源号码private String TelPHONECONTEXT ="iViralLink"; // 短信内容 特殊关键字//    8448631136public SMSContentObserver(Context context, Handler handler) {super(handler);mContext = context ;mHandler = handler ;}/*** 当所监听的Uri发生改变时,就会回调此方法** @param selfChange  此值意义不大 一般情况下该回调值false*/@Overridepublic void onChange(boolean selfChange){Log.i(TAG, "the sms table has changed");//查询收件箱里的内容Uri outSMSUri = Uri.parse("content://sms/inbox") ;Cursor c = mContext.getContentResolver().query(outSMSUri, null, null, null,"date desc");if(c != null){Log.i(TAG, "the number of send is "+c.getCount()) ;StringBuilder sb = new StringBuilder() ;c.moveToNext();String message = c.getString(c.getColumnIndex("body"));      // 短信内容String phone = c.getString(c.getColumnIndex("address"));    //短信来源号码Log.i(TAG,"message : "+message);Log.i(TAG,"phone : "+phone);c.close();
//            if(checkPhone(phone) &&checkString(message)){ //指定号码 指定字符串匹配String code = patternCode(message);assert code != null;if(!TextUtils.isEmpty(code) ){strContent = code;}mHandler.obtainMessage(1, sb.toString()).sendToTarget();
//            }}}//指定一个号码,只读取与他有关的新消息。private boolean checkPhone(String phone) {// TODO Auto-generated method stubString c_phone = TELPHONE;if(c_phone.equals(phone) )return true;return false;}//指定一关键字符串,用来确认短信内容是我们想要去提取的private boolean checkString(String message){if(TextUtils.isEmpty(message))return false;Pattern p = Pattern.compile(TelPHONECONTEXT);          //这个关键字符串可以自定义Matcher matcher = p.matcher(message);if(matcher.find())return true;return false;}//匹配短信中的数字(验证码)private String patternCode(String patternContent){if(TextUtils.isEmpty(patternContent))return null;Pattern p = Pattern.compile(patternCoder);Matcher matcher = p.matcher(patternContent);if(matcher.find())return matcher.group();return null;}public String getStrContent(){return strContent;}
}

然后在需要的地方调用:

private SMSContentObserver smsContentObserver;private Handler mHandler = new Handler() {public void handleMessage(Message msg) {switch (msg.what) {case 1:String outbox = smsContentObserver.getStrContent();//(String) msg.obj;  验证码内容
//                    et_code.setText(outbox);   //直接把验证码输入到指定输入框break;default:break;}}};private void initRegisterContentObserver() {smsContentObserver = new SMSContentObserver(this, mHandler);Uri smsUri = Uri.parse("content://sms");getContentResolver().registerContentObserver(smsUri, true, smsContentObserver);}@Overrideprotected void onDestroy() {super.onDestroy();if (getContentResolver()!=null){getContentResolver().unregisterContentObserver(smsContentObserver);}}@Overrideprotected int getLayoutId() {return R.layout.act_register;}@Overrideprotected void onCreate(@Nullable Bundle bundle) {super.onCreate(bundle);initRegisterContentObserver();   //初始化smsContentObserver 拦截验证码}

需要注意,edittext的inputstyle需要设置为number:

   <EditTextandroid:id="@+id/et_code"android:layout_width="match_parent"android:layout_height="@dimen/dp30"android:background="@null"android:layout_centerVertical="true"android:layout_toRightOf="@+id/iv_code"android:lines="1"android:textSize="@dimen/sp14"android:hint="请输入验证码"android:textColorHint="#999"android:textColor="#fff"android:inputType="number"android:layout_toLeftOf="@+id/tv_get_code"android:layout_marginRight="@dimen/dp10"/>

最后就是在获取短信权限,这个属于危险权限,需要动态获取:

   @Overrideprotected void onCreate(@Nullable Bundle bundle) {super.onCreate(bundle);if(!checkPermission()) if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){requestPermissions(PS, PS.hashCode());}initRegisterContentObserver();}public void onRequestPermissionsResult(int req, @NonNull String[] ps, @NonNull int[] res){if(req==PS.hashCode()){if(!checkPermission()) getProxy().alert("定位权限不足,请检查手机设置");return;}super.onRequestPermissionsResult(req, ps, res);}boolean checkPermission(){boolean ok=true;for(String p: PS){ok=checkCallingOrSelfPermission(p)== PackageManager.PERMISSION_GRANTED;if(!ok) break;}if(!ok) return false;return true;}static final String[] PS={
//            Manifest.permission.ACCESS_FINE_LOCATION,    //定位
//            Manifest.permission.WRITE_EXTERNAL_STORAGE, //SD卡写入Manifest.permission.READ_SMS,Manifest.permission.RECEIVE_SMS};

实际完成实现的效果如下:

完成~

登录页获取短信验证码 读取短信验证码到键盘相关推荐

  1. 小程序:登录页获取用户信息并传递用户数据到个人中心页

    步骤一:个人中心页添加"立即登录"按钮跳转至登录页 一.个人中心页的me.wxml代码 <view class="userinfo"><but ...

  2. java读取手机短信_使用短信猫读取短信java代码

    短信猫简单配置:https://www.cnblogs.com/Big-Boss/p/9699880.html 测试发送短信代码:https://www.cnblogs.com/Big-Boss/p/ ...

  3. java读取通达信day_Go读取通达信历史日线数据

    原标题:Go读取通达信历史日线数据 突然间想使用Go从通达信读取A股历史行情信息,其实也蛮简单的.从通达信获取数据难点在于分析数据结构,而读取则各类语言分分钟搞定. 准备工作 1、下载安装通达信,通达 ...

  4. android app读取短信,uni-app读取短信

    在我们的日常开发中,我们可能会遇到,读取用短信中的验证码,然后实现一个自动填充的功能. 但是呢,在插件市场,我暂时还没有找到相应的插件,来使用, 所以呢,我想到了一种曲线的方式,那就是获取到设备的短信 ...

  5. python 通达信 dll_Python读取通达信本地数据

    一.介绍 python获取股票数据的方法很多,其中 Tushare 财经数据接口包很好用,当然,也可以通过通达信本地的数据获取,这样更为方便. 日线数据存在这路径下 D:\通达信\vipdoc\sh\ ...

  6. matlab 读取 通达信,Matlab读取通达信数据库需要学习那些方面的知识?

    本帖最后由 qdwxzzy 于 2013-7-24 10:48 编辑 在论坛找了些帖子,然后去通达信的网站下载了数据,尝试读取sh000004.day的数据,代码如下 clear all; fn='s ...

  7. java读取通达信day_c#读取通达信历史数据的方法

    public Bar ReadBarMin(BinaryReader br, int instrumentId, long size) { int date = br.ReadUInt16(); in ...

  8. Android 读取短信内容(模拟器)

    读取短信内容 读取短信的内容就要知道短信放在哪里,然后通过查询语句把结果封装到实体类的List中,再全部打印出来即可. 下面是具体的代码: activity_main.xml <?xml ver ...

  9. 健身管理系统【登录页,首页,会员添加,修改,查询】

    一,简介 说明:这是我正式做的第一个简易项目 使用场地:中小健身场所 使用对象:前端对健身用户的管理,老板对管理员的管理 所用到的技术: 前端:HTML+JS+CSS 后端:C#的MVC框架 数据库: ...

最新文章

  1. swift_007(Swift的Array 数组)
  2. retinaface tensorRT
  3. 6个很棒的PostCSS插件,让您成为一个CSS向导
  4. 大型Web 网站 Asp.net Session过期你怎么办
  5. 编译原理拉链回填技术c语言,编译原理 第1、2、3、4章复习(期末).doc
  6. Git merge分支到master
  7. origin调整纵坐标刻度值_Origin数据图坐标刻度值特殊标注的方法
  8. 3.4.4 Raucous Rockers“破锣摇滚”乐队 USACO
  9. 2021-11-25 使用kali自带的SET工具制作钓鱼网站
  10. Go操作MySQL数据库库
  11. transforms操作
  12. UltraVNC(TightVNC、WinVNC)源码分析文档
  13. poi-java导出word的表格中换行
  14. DOM初探(17)——查看元素的尺寸与位置
  15. linux系统添加根证书 linux证书信任列表
  16. 【墨天轮专访第四期】华为云GaussDB:发挥生态优势,培养应用型DBA
  17. Linux下Fluent运行脚本及PBS脚本、Fluent TUI指令和Tecplot的一些操作
  18. 谷歌地球如何下载使用高程数据
  19. qq空间评论bug?
  20. Vue学习(二)动态绑定与事件监听

热门文章

  1. 都柏林圣三一大学计算机课程,都柏林圣三一大学语言课重大更新(附2020年9月截止申请专业)...
  2. 寒假到了,神兽归笼?程序员整治“熊孩子”有妙招
  3. 如何将草料二维码收集到的表单信息同步至腾讯文档
  4. 如何在Word添加插入页脚?方法分享!word怎样设置加入页脚?
  5. LaTeX英文论文中插入汉字/中文
  6. springboot+mybatis+maven插件逆向工程整合
  7. 初探 Eclipse RCP
  8. 小熊派gd32f303学习之旅(7)—使用PWM实现LED呼吸灯
  9. DevExpress中GridView的日期编辑器RepositoryItemDateEdit属性VistaCalendarViewStyle失效问题
  10. win10计算机管理字体糊,win10字体模糊如何解决