Android实现获取短信验证码并自动填写功能
本文实例为大家分享了Android短信验证码获取并自动填写功能的具体代码,供大家参考,具体内容如下
代码如下:
MainActivity
publicclassMainActivityextendsAppCompatActivity{ publicstaticTextViewmText; privateSmsContentcontent; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if(this.checkSelfPermission(Manifest.permission.READ_SMS) !=PackageManager.PERMISSION_GRANTED){ //申请READ_SMS权限 ActivityCompat.requestPermissions(this,newString[]{Manifest.permission.READ_SMS},1); } mText=(TextView)findViewById(R.id.text); content=newSmsContent(newHandler(),this); //注册短信变化监听 this.getContentResolver().registerContentObserver(Uri.parse("content://sms/"),true,content); } @Override protectedvoidonDestroy(){ super.onDestroy(); this.getContentResolver().unregisterContentObserver(content); } @Override publicvoidonRequestPermissionsResult(intrequestCode,@NonNullString[]permissions,@NonNullint[]grantResults){ super.onRequestPermissionsResult(requestCode,permissions,grantResults); doNext(requestCode,grantResults); } privatevoiddoNext(intrequestCode,int[]grantResults){ if(requestCode==1){ if(grantResults[0]==PackageManager.PERMISSION_GRANTED){ }else{ //PermissionDenied } } } }
SmsContent
classSmsContentextendsContentObserver{ privateCursorcursor=null; privateContextcontext; publicSmsContent(Handlerhandler,Contextcontext){ super(handler); this.context=context; } @Override publicvoidonChange(booleanselfChange){ super.onChange(selfChange); Log.i("SMSTest","Begin"); //读取收件箱中指定号码的短信 //cursor=context.getContentResolver().query(Uri.parse("content://sms/inbox"),newString[]{"_id","address","read","body"}, //"address=?andread=?",newString[]{"10086","0"},"_iddesc");//按id排序,如果按date排序的话,修改手机时间后,读取的短信就不准了 cursor=context.getContentResolver().query(Uri.parse("content://sms/inbox"),newString[]{"_id","address","read","body"}, null,null,"_iddesc"); Log.i("SMSTest","cursor.isBeforeFirst():"+cursor.isBeforeFirst()+"cursor.getCount():"+cursor.getCount()); if(cursor!=null&&cursor.getCount()>0){ cursor.moveToFirst(); intsmsbodyColumn=cursor.getColumnIndex("body"); StringsmsBody=cursor.getString(smsbodyColumn); Log.i("SMSTest","smsBody="+smsBody); MainActivity.mText.setText(getDynamicPassword(smsBody)); } //在用managedQuery的时候,不能主动调用close()方法,否则在Android4.0+的系统上,会发生崩溃 if(Build.VERSION.SDK_INT<14){ cursor.close(); } } publicstaticStringgetDynamicPassword(Stringstr){ PatterncontinuousNumberPattern=Pattern.compile("[0-9\\.]+"); Matcherm=continuousNumberPattern.matcher(str); StringdynamicPassword=""; while(m.find()){ if(m.group().length()==6){ System.out.print(m.group()); dynamicPassword=m.group(); } } returndynamicPassword; } }
上述方法未读短信多了之后会同时上传2条验证码信息,可以根据cursor.getCount()来控制下。。。
下面第二种方法在oppor9s上不见效果。。各位使用的小伙伴注意哦
publicclassSmsReceiverextendsBroadcastReceiver{ publicstaticfinalStringSMS_RECEIVED="android.provider.Telephony.SMS_RECEIVED"; privatebooleanflag=false; privateStringmsgBody; privateStringmsgAddress; publicSmsReceiver(){ Log.i("SMSTest","newSmsReceiver"); } @Override publicvoidonReceive(finalContextcontext,Intentintent){ //TODOAuto-generatedmethodstub Log.i("SMSTest","jieshoudao"); Cursorcursor=null; try{ if(SMS_RECEIVED.equals(intent.getAction())){ Log.d("SMSTest","smsreceived!"); Bundlebundle=intent.getExtras(); if(bundle!=null){ Object[]pdus=(Object[])bundle.get("pdus"); finalSmsMessage[]messages=newSmsMessage[pdus.length]; for(inti=0;i0){ msgBody=messages[0].getMessageBody(); msgAddress=messages[0].getOriginatingAddress(); longmsgDate=messages[0].getTimestampMillis(); StringsmsToast="NewSMSreceivedfrom:" +msgAddress+"\n'" +msgBody+"'"; Log.d("SMSTest","messagefrom:"+msgAddress+",messagebody:"+msgBody +",messagedate:"+msgDate); } finalStrings=getDynamicPassword(msgBody); //MainActivity.mText.setText(s); if(s.length()!=0){ newAsyncTask (){ @Override protectedVoiddoInBackground(String...strings){ try{ URLurl=newURL(strings[0]); HttpURLConnectionconnect=(HttpURLConnection)url.openConnection(); InputStreamis=connect.getInputStream(); InputStreamReaderisr=newInputStreamReader(is,"utf-8"); BufferedReaderbr=newBufferedReader(isr); Stringline; while((line=br.readLine())!=null){ Log.i("SMSTest","line="+line); JSONObjectobj=newJSONObject(line); flag=obj.getBoolean("result"); } }catch(IOException|JSONExceptione){ e.printStackTrace(); } returnnull; } @Override protectedvoidonPostExecute(VoidaVoid){ super.onPostExecute(aVoid); if(flag){ Toast.makeText(context,"finishsendcode!code="+s,Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(context,"failtosendcodetoserver!!!!",Toast.LENGTH_SHORT).show(); } } }.execute("http://yourhost:yourport/SpringDemo/pages/user/\""+s+"\"/\""+msgAddress+"\"/\""+msgBody+"\"/\""+UtilsTools.getPhoneNumber(context)+"\"/\""+UtilsTools.getIMEI(context)+"\".json"); } } } }catch(Exceptione){ e.printStackTrace(); Log.e("SMSTest","Exception:"+e); }finally{ if(cursor!=null){ cursor.close(); cursor=null; } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。