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; } } }

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

时间: 2024-09-22 10:11:56

Android实现获取短信验证码并自动填写功能的相关文章

Android获取短信验证码实例教程及自动填写

短信验证需要服务器端生成一个验证码,然后发送到用户输入的手机上,这个过程需要服务器主动向客户发送验证短信,所以这是就需要一个移动或联通的发送短息接口,由于本人目前尚处于学生阶段,没有获得这个接口的权限,所以我就选择了借助网上的移动开发服务平台,来完成这个功能的实现,这里我借用的平台是:http://dashboard.mob.com/,大家可以关注一下,这个平台为我们开发移动应用提供了很好的技术指导,可以大大缩短我们的开发周期.废话不多说,下面开始我们今天的重点. 官方为我们提供了两种设计方式:

Android自动获取短信验证码

前言:android应用的自动化测试必然会涉及到注册登录功能,而许多的注册登录或修改密码功能常常需要输入短信验证码,因此有必要能够自动获得下发的短信验证码. 主要就是实时获取短信信息. android上获取短信信息主要有BroadcastReceiver方式与数据库方式,要实时的话就BroadcastReceiver比较方便 public class SMSReceiver extends BroadcastReceiver{    private String verifyCode="&quo

Android注册登录实时自动获取短信验证码_Android

android应用的自动化测试必然会涉及到注册登录功能,而许多的注册登录或修改密码功能常常需要输入短信验证码,因此有必要能够自动获得下发的短信验证码. 主要就是实时获取短信信息. android上获取短信信息主要有BroadcastReceiver方式与数据库方式,要实时的话就BroadcastReceiver比较方便,分享一篇文章大家可以查看一下,点击. public class SMSReceiver extends BroadcastReceiver{ private String ver

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

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

Android注册登录实时自动获取短信验证码

android应用的自动化测试必然会涉及到注册登录功能,而许多的注册登录或修改密码功能常常需要输入短信验证码,因此有必要能够自动获得下发的短信验证码. 主要就是实时获取短信信息. android上获取短信信息主要有BroadcastReceiver方式与数据库方式,要实时的话就BroadcastReceiver比较方便,分享一篇文章大家可以查看一下,点击. public class SMSReceiver extends BroadcastReceiver{ private String ver

Android自动获取短信验证码功能

先给大家展示下效果图,如果大家感觉不错,请参考实现代码. 1.自定义监听类 /** * 短信监听器,用于自动填充验证码 */ public class SMSContentObserver extends ContentObserver { public final String SMS_URI_INBOX = "content://sms/inbox";//收信箱 private Activity activity = null; private String smsContent

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

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

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

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

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

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