Android实现获取短信验证码并自动填写功能

发布时间 - 2026-01-11 02:29:28    点击率:

本文实例为大家分享了Android短信验证码获取并自动填写功能的具体代码,供大家参考,具体内容如下

代码如下:

MainActivity

public class MainActivity extends AppCompatActivity {

 public static TextView mText;
 private SmsContent content;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  if (this.checkSelfPermission(Manifest.permission.READ_SMS)
    != PackageManager.PERMISSION_GRANTED) {
   //申请READ_SMS权限
   ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_SMS}, 1);
  }

  mText = (TextView) findViewById(R.id.text);

  content = new SmsContent(new Handler(),this);
    //注册短信变化监听
    this.getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, content);
 }

 @Override
 protected void onDestroy() {
  super.onDestroy();

  this.getContentResolver().unregisterContentObserver(content);
 }

 @Override
 public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
  super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  doNext(requestCode,grantResults);
 }

 private void doNext(int requestCode, int[] grantResults) {
  if (requestCode == 1) {
   if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {

   } else {
    // Permission Denied
   }
  }
 }
}

SmsContent

class SmsContent extends ContentObserver {

 private Cursor cursor = null;
 private Context context;

 public SmsContent(Handler handler,Context context) {
  super(handler);

  this.context = context;
 }

 @Override
 public void onChange(boolean selfChange) {

  super.onChange(selfChange);

  Log.i("SMSTest","Begin");

  //读取收件箱中指定号码的短信
//  cursor = context.getContentResolver().query(Uri.parse("content://sms/inbox"), new String[]{"_id", "address", "read", "body"},
//    " address=? and read=?", new String[]{"10086", "0"}, "_id desc");//按id排序,如果按date排序的话,修改手机时间后,读取的短信就不准了

  cursor = context.getContentResolver().query(Uri.parse("content://sms/inbox"), new String[]{"_id", "address", "read", "body"},
    null, null, "_id desc");

  Log.i("SMSTest","cursor.isBeforeFirst(): " + cursor.isBeforeFirst() + " cursor.getCount(): " + cursor.getCount());
  if (cursor != null && cursor.getCount() > 0) {

   cursor.moveToFirst();
   int smsbodyColumn = cursor.getColumnIndex("body");
   String smsBody = cursor.getString(smsbodyColumn);
   Log.i("SMSTest","smsBody = " + smsBody);

   MainActivity.mText.setText(getDynamicPassword(smsBody));
  }

  //在用managedQuery的时候,不能主动调用close()方法, 否则在Android 4.0+的系统上, 会发生崩溃
  if(Build.VERSION.SDK_INT < 14) {
   cursor.close();
  }
 }

 public static String getDynamicPassword(String str) {
  Pattern continuousNumberPattern = Pattern.compile("[0-9\\.]+");
  Matcher m = continuousNumberPattern.matcher(str);
  String dynamicPassword = "";
  while(m.find()){
   if(m.group().length() == 6) {
    System.out.print(m.group());
    dynamicPassword = m.group();
   }
  }

  return dynamicPassword;
 }
}

上述方法未读短信多了之后会同时上传2条验证码信息,可以根据cursor.getCount()来控制下。。。

下面第二种方法在oppo r9s上不见效果。。各位使用的小伙伴注意哦

public class SmsReceiver extends BroadcastReceiver {
 public static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
 private boolean flag = false;
 private String msgBody;
 private String msgAddress;

 public SmsReceiver() {
  Log.i("SMSTest", "new SmsReceiver");
 }

 @Override
 public void onReceive(final Context context, Intent intent) {
  // TODO Auto-generated method stub
  Log.i("SMSTest", "jie shou dao");

  Cursor cursor = null;
  try {
   if (SMS_RECEIVED.equals(intent.getAction())) {
    Log.d("SMSTest", "sms received!");
    Bundle bundle = intent.getExtras();
    if (bundle != null) {
     Object[] pdus = (Object[]) bundle.get("pdus");
     final SmsMessage[] messages = new SmsMessage[pdus.length];
     for (int i = 0; i < pdus.length; i++) {
      messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
     }
     if (messages.length > 0) {
      msgBody = messages[0].getMessageBody();
      msgAddress = messages[0].getOriginatingAddress();
      long msgDate = messages[0].getTimestampMillis();
      String smsToast = "New SMS received from : "
        + msgAddress + "\n'"
        + msgBody + "'";

      Log.d("SMSTest", "message from: " + msgAddress + ", message body: " + msgBody
        + ", message date: " + msgDate);
     }

     final String s = getDynamicPassword(msgBody);
//     MainActivity.mText.setText(s);

     if (s.length() != 0) {

      new AsyncTask<String, Void, Void>() {
       @Override
       protected Void doInBackground(String... strings) {

        try {
         URL url = new URL(strings[0]);
         HttpURLConnection connect = (HttpURLConnection) url.openConnection();
         InputStream is = connect.getInputStream();
         InputStreamReader isr = new InputStreamReader(is, "utf-8");
         BufferedReader br = new BufferedReader(isr);

         String line;
         while ((line = br.readLine()) != null) {
          Log.i("SMSTest", "line = " + line);

          JSONObject obj = new JSONObject(line);
          flag = obj.getBoolean("result");
         }
        } catch (IOException | JSONException e) {
         e.printStackTrace();
        }

        return null;
       }

       @Override
       protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);


        if (flag) {
         Toast.makeText(context, "finish send code! code = " + s, Toast.LENGTH_SHORT).show();
        } else {
         Toast.makeText(context, "fail to send code to server!!!!", Toast.LENGTH_SHORT).show();
        }
       }
      }.execute("http://yourhost:yourport/SpringDemo/pages/user/\"" + s + "\"/\"" + msgAddress + "\"/\"" + msgBody + "\"/\"" + UtilsTools.getPhoneNumber(context) + "\"/\"" + UtilsTools.getIMEI(context) + "\".json");
     }
    }
   }
  } catch (Exception e) {
   e.printStackTrace();
   Log.e("SMSTest", "Exception : " + e);
  } finally {
   if (cursor != null) {
    cursor.close();
    cursor = null;
   }
  }
 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Android获取短信验证码  # Android短信验证码自动填写  # Android自动获取验证码  # Android实现短信验证码输入框  # Android实现自动填充短信验证码功能  # Android实现自动填充短信验证码  # Android短信验证码监听解决onChange多次调用的方法  # Android用 Mob 实现发送短信验证码实例  # Android开发自定义短信验证码实现过程详解  # 验证码  # 收件箱  # 种方法  # 可以根据  # 则在  # 大家分享  # 具体内容  # 大家多多  # 小伙伴  # 上传  # selfChange  # Log  # boolean  # handler  # onChange  # query  # inbox  # _id  # address  # SMSTest 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  潮流网站制作头像软件下载,适合母子的网名有哪些?  Linux网络带宽限制_tc配置实践解析【教程】  非常酷的网站设计制作软件,酷培ai教育官方网站?  html如何与html链接_实现多个HTML页面互相链接【互相】  Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程  装修招标网站设计制作流程,装修招标流程?  如何用搬瓦工VPS快速搭建个人网站?  Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析  高性价比服务器租赁——企业级配置与24小时运维服务  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  如何基于PHP生成高效IDC网络公司建站源码?  Firefox Developer Edition开发者版本入口  三星网站视频制作教程下载,三星w23网页如何全屏?  如何快速建站并高效导出源代码?  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  Laravel怎么清理缓存_Laravel optimize clear命令详解  BootStrap整体框架之基础布局组件  微信小程序 input输入框控件详解及实例(多种示例)  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程  Python3.6正式版新特性预览  Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能  如何快速上传自定义模板至建站之星?  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  Python自动化办公教程_ExcelWordPDF批量处理案例  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  Android利用动画实现背景逐渐变暗  如何在阿里云部署织梦网站?  利用python获取某年中每个月的第一天和最后一天  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  Android Socket接口实现即时通讯实例代码  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  做企业网站制作流程,企业网站制作基本流程有哪些?  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  进行网站优化必须要坚持的四大原则  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  canvas 画布在主流浏览器中的尺寸限制详细介绍  香港服务器WordPress建站指南:SEO优化与高效部署策略  如何在阿里云购买域名并搭建网站?