前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android实现获取短信验证码并自动填写功能

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

作者头像
砸漏
发布2020-10-22 11:11:58
1.8K0
发布2020-10-22 11:11:58
举报
文章被收录于专栏:恩蓝脚本

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

代码如下:

MainActivity

代码语言:javascript
复制
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

代码语言:javascript
复制
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上不见效果。。各位使用的小伙伴注意哦

代码语言:javascript
复制
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;
}
}
}

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
验证码
腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档