本文实例为大家分享了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"),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实现获取短信验证码并自动填写功能所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)