天天看點

擷取手機端驗證碼

前言: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"/>

測試過程中需要用到短信驗證碼時就可以實時擷取了