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;
}
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。