前言:android应用的必然会涉及到注册登录功能,而许多的注册登录或修改密码功能常常需要输入短信验证码,因此有必要能够自动获得下发的短信验证码。
主要就是实时获取短信信息。
android上获取短信信息主要有broadcastreceiver方式与方式,要实时的话就broadcastreceiver比较方便
public class smsreceiver extends broadcastreceiver{ private string verifycode=""; public static final string tag = "smsreceiver"; public static final string sms_received_action = "android.provider.telephony.sms_received"; @override public void onreceive(context context, intent intent){ if (intent.getaction().equals(sms_received_action)){ smsmessage[] messages = getmessagesfromintent(intent); for (smsmessage message : messages){ log.i(tag, message.getoriginatingaddress() " : " message.getdisplayoriginatingaddress() " : " message.getdisplaymessagebody() " : " message.gettimestampmillis()); string smscontent=message.getdisplaymessagebody(); log.i(tag, smscontent); writefile(smscontent);//将短信内容写入sd卡 } } } public final smsmessage[] getmessagesfromintent(intent intent){ object[] messages = (object[]) intent.getserializableextra("pdus"); byte[][] pduobjs = new byte[messages.length][]; for (int i = 0; i < messages.length; i ) { pduobjs[i] = (byte[]) messages[i]; } byte[][] pdus = new byte[pduobjs.length][]; int pducount = pdus.length; smsmessage[] msgs = new smsmessage[pducount]; for (int i = 0; i < pducount; i ) { pdus[i] = pduobjs[i]; msgs[i] = smsmessage.createfrompdu(pdus[i]); } return msgs; } //将短信内容写到sd卡上的文件里,便于将文件pull到pc,这样可方便其它如www/wap平台的自动化 @suppresslint("sdcardpath") public void writefile(string str){ string filepath="/mnt/sdcard/verifycode.txt"; byte [] bytes = str.getbytes(); try{ file file=new file(filepath); file.createnewfile(); fileoutputstream fos=new fileoutputstream(file); fos.write(bytes); fos.close(); }catch(ioexception e){ e.printstacktrace(); } } |
如此当有短信收到时就可以将短信内容写到sd卡中的文件里
在另一个java类中写个读取文件内容的方法,并在写测试用例过程中,将得到的string按验证码的具体位置截取即可。
public string read(string str) throws ioexception{ file file=new file(str); fileinputstream fis=new fileinputstream(file); stringbuffer sb=new stringbuffer(); bufferedinputstream bis=new bufferedinputstream(fis); bufferedreader read = new bufferedreader (new inputstreamreader(bis)); int c=0; while ((c=read.read())!=-1) { sb.append((char) c); } read.close(); bis.close(); fis.close(); log.i(tag, sb.tostring()); string verify=sb.tostring(); return verify; } |
最后需要在manifest中增加申明,且注册权限
测试过程中需要用到短信验证码时就可以实时获取了