Android实现获取短信验证码并自动填写功能
时间:2022-07-28
本文章向大家介绍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;
}
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助。
- 【Python】30行代码教你将微信变成智能回复机器人
- 【python爬虫】知乎互联网话题问答内容可视化分析
- “mysqlbinlog”工具做binlog server靠谱吗?
- 看各路神仙如何大战MySQL insecure warning报警有感
- 由optimizer_switch所引起的诡异问题
- 【Oracle 12c Flex Cluster专题 】— Leaf Node的故障迁移
- MySQL中的统计信息相关参数介绍
- iOS学习——UITableViewCell两种重用方法的区别
- iOS学习——UIPickerView的实现年月选择器
- iOS学习——自动定位
- iOS学习——iOS原生实现二维码扫描
- iOS学习——iOS开发小知识点集合
- iOS学习——@class和#import的区别
- iOS学习——UIView的研究
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 《高效能程序员的修炼》读书笔记
- linux之centos7防火墙基本使用详解
- Ubuntu安装scrcpy完成手机投屏和控制(Ubuntu用QQ微信的另一种方法)
- CentOS7 systemd添加自定义系统服务的方法
- Linux中sudo、su和su -命令的区别小结
- 非零环绕规则
- Linux被中断的系统如何调用详解
- centos 修改ssh默认端口号的方法示例
- Linux中特殊权限SUID、SGID与SBIT的深入讲解
- linux新文件权限设置之umask的深入理解
- 在 CentOS 8/RHEL 8 上安装和使用 Cockpit的方法
- Linux删除文件提示Operation not permitted的处理办法
- 微任务与宏任务
- Linux 文件权限的详细介绍
- Linux统计一个文件中特定字符个数的方法