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

本文实例为大家分享了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;
   }
  }
 }

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

(0)

相关推荐

  • Android实现短信验证码获取自动填写功能(详细版)

    现在的应用在注册登录或者修改密码中都用到了短信验证码,那在android中是如何实现获取短信验证码并自动填写的呢? 首先,需要要在manifest中注册接收和读取短信的权限: <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission> <uses-permission android:name="android.permission.READ_

  • Android获取短信验证码的实现方法

    先给大家展示下效果图,如果感觉不错,请参考实现思路详解 Android开发中关于短息验证码的设计层出不穷,越来越多的应用为了更好的提高软件的安全性,开始使用通过服务器向用户发送验证码的方式,来保护用户个人信息的安全性.无论是用户注册时的信息验证还是当用户发出找回密码请求时的短信验证,他们的工作原理大致上是一致的,因为项目的需要研究了一下关于这方面的知识,本篇我将带领大家一起实现这一当下流行的设计方案. 众所周知,短信验证需要服务器端生成一个验证码,然后发送到用户输入的手机上,这个过程需要服务器主

  • Android中用Bmob实现短信验证码功能的方法详解

    这篇文章主要介绍发送验证码和校验验证码的功能,用到一个第三方平台Bmob,那Bmob是什么呢?Bmob可以开发一个云存储的移动应用软件,他提供了大量的标准的API接口,根据需要接入相关服务,开发者可以更加专注于应用的开发,让产品交付更快速,验证码功能就是其中一个. 一.跟其他第三方一样,我们开发之前要做一些准备工作. 1.首先,去官网注册一个帐号:http://www.bmob.cn/: 2.然后就可以创建应用了:具体怎么做Bmob说得很清楚了(官方操作介绍),如果你不想看,我简单说一下:点击右

  • Android开发工程中集成mob短信验证码功能的方法

    一.前言 现在的app基本上都需要用到短信功能,注册时或者有消息通知时需要给用户发送一条短信,但是对于个人开发者来说,去买第三方的短信服务实在是有点奢侈,很好的是mob为我们提供了免费的短信验证码服务功能,我不是打广告,的确觉得这项服务很不错.那么下面就简单讲一下如何在自己的工程里集成mob的短信功能,其实整个流程并不复杂,只是个人觉得mob的官方文档有点小乱,官方Demo也有点小复杂,同时有一些细节地方容易被忽视,也会导致一些问题. PS:太喜欢mob的logo了. 二.实现过程 本篇只涉及A

  • Android获取和读取短信验证码的实现方法

    现如今,验证码在Android的客户端还是非常普遍的.通过手机账号和验证码直接去注册应用账户的信息.很多应用都以这种方式来完成注册.简单的介绍一下吧. Android获取短信验证码还是比较简单的,通过Mob官网提供的ShareSDK,调用其中内部的方法,就可以获取到短信的验证码了.提供一下Mob的官网地址.http://www.mob.com/#/在官网上注册相关的信息之后,下载相关的jar包和.so文件就可以实现获取短信验证码了(2.0之前的版本都需要下载jar包和 .so文件,而现在的2.2

  • Android实现自动提取短信验证码功能

    本文实例讲解了Android自动提取短信验证码解决方案,分享给大家供大家参考,具体内容如下 主要功能及优点 1.收到验证码短信后,自动提取短信中的验证码填写到相应输入框 2.可指定一个号码,只读取与他有关短信,避免提取来源错误 3.利用正则表达式,可匹配各种类型验证码 模块集成关键步骤     将auto_getcode_demo中src包里的SMSContentObserver类复制到你的项目src包中 在SMSContentObserver中:    修改正则表达式内容来匹配自己想要获取的字

  • Android实现短信验证码自动填写功能

    本实例为大家分享了Android实现短信验证码自动填写功能,供大家参考,具体内容如下 实现思路很简单: 1.在需要输入验证码的Activity代码注册监听短信的广播 2.拦截短信,获取其中的验证码 3.回写到EditText private SmsReciver smsReciver = new SmsReciver(); /** 收到短信Action **/ String ACTION_SMS_RECIVER = "android.provider.Telephony.SMS_RECEIVED

  • Android如何通过手机自动获取短信验证码

    本文实例为大家分享了Android实现手机自动获取短信验证码功能,供大家参考,具体内容如下 1.短信监听广播 2.读取短信内容 3.截取短信内容[可以 reg截取] 4.填写至相应控件 PS:DevStore测试没有获取到验证码 源码片段 public class MainActivity extends Activity { private BroadcastReceiver smsReceiver; private IntentFilter filter2; private Handler

  • Android手机号注册、绑定手机号获取短信验证码实例

    本文写了一个常见的功能--手机app中注册或绑定手机号的获取验证码的功能,也就是短信验证功能 具体效果就是,你在注册界面填写手机号,点击获取验证码按钮,---然后会收到验证短信,填入验证码后点击注册按钮,如果验证正确就可以跳转到另外一个界面 1.首先大家需要在mob官网注册一个账号,mob是一个免费的短信验证平台 2.在mob.com后台创建应用 3.下载对应的sdk 4.将sdk作为一个library导入到你的项目中 5.现在就可以在你的项目中编写代码使用mob提供的这个功能了 具体代码如下:

  • Android开发之获取短信验证码后按钮背景变化并且出现倒计时

    目前越来越多的app在注册或是进行对应操作时,要求获取短信验证码,在点击了获取短信验证码的按钮后,就是出现倒计时,比如倒计时120S,在倒计时期间内,按钮背景变化并且出现倒计时,当倒计时结束后,如果你没有获取到验证码,可以再次点击. 代码如下所示: VerCodeTimer mVerCodeTimer=(Button) findViewById(R.id.login_get_ver_code); private class VerCodeTimer extends CountDownTimer

随机推荐