天天看点

获取手机端验证码

前言: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中增加申明,且注册权限

<receiver android:name="com.cplatform.surfdesktop.test.util.smsreceiver">

            <intent-filter>

                <action android:name="android.provider.telephony.sms_received" />

            </intent-filter>

 </receiver>

<uses-permission android:name="android.permission.receive_sms"></uses-permission>

<uses-permission android:name="android.permission.write_external_storage"></uses-permission>

<uses-permission android:name="android.permission.read_sms"/>

测试过程中需要用到短信验证码时就可以实时获取了