Mueyiwa Moses Ikomi
Mueyiwa Moses Ikomi

Reputation: 1142

How to Filter/Extract Code from SMS (Android)

So i'm working on a WhatsApp like verification system where user inputs the code received via sms and code is sent back to the server..yada yada ..all that basic stuff.

My dilemma is that i have received and read the sms correctly. How do i filter the body so that that it passes the number (not phone number but verification code) to the editText automatically. I'm trying to avoid users having to enter the verification code manually. Lemme show some code below.

public void processReceive(Context context, Intent intent){

    Bundle bundle = intent.getExtras();
    if(bundle == null){
        return;
    }

    Object[] objectArray = (Object[])bundle.get("pdus");

    for(int i = 0; i < objectArray.length; i++){
        SmsMessage smsMsg = SmsMessage.createFromPdu((byte[])objectArray[i]);
        String smsBody = smsMsg.getMessageBody();

        Toast.makeText(context, smsBody, Toast.LENGTH_SHORT).show();
    }

}

//In the code above, my broadcastReceiver receives the sms and i can display the body in a toast. The sms goes something like this: "Your verification code: 12345".

How do i get just the code from the sms and send its value to and editText programmatically like WhatsApp does.

number = (EditText) findViewById(R.id.number);

Thank you. You input is greatly appreciated

Upvotes: 2

Views: 3040

Answers (3)

rakesh rajput
rakesh rajput

Reputation: 626

  1. register Broad cast Receiver in android manifest using below mention code.

    <!-- SMS Receiver -->
    <receiver android:name=".receiver.SmsReceiver">
        <intent-filter android:priority="99999">
            <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
        </intent-filter>
    </receiver>
    
  2. Create Broad Cast Receiver using below mention code.

    @Override public void onReceive(Context context, Intent intent) {

    final Bundle bundle = intent.getExtras();
    try {
        if (bundle != null) {
            Object[] pdusObj = (Object[]) bundle.get("pdus");
            for (Object aPdusObj : pdusObj) {
                SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) aPdusObj);
                String senderAddress = currentMessage.getDisplayOriginatingAddress();
                String message = currentMessage.getDisplayMessageBody();
    
                Log.e(TAG, "Received SMS: " + message + ", Sender: " + senderAddress);
    
                // if the SMS is not from our gateway, ignore the message
                if (!senderAddress.toLowerCase().contains(Config.SMS_ORIGIN.toLowerCase())) {
                    Log.e(TAG, "SMS is not for our app!");
                    return;
                }
    
                // verification code from sms
                String verificationCode = getVerificationCode(message);
    
                Log.e(TAG, "OTP received: " + verificationCode);
    
                Intent hhtpIntent = new Intent(context, HttpService.class);
                hhtpIntent.putExtra("otp", verificationCode);
                context.startService(hhtpIntent);
            }
        }
    } catch (Exception e) {
        Log.e(TAG, "Exception: " + e.getMessage());
    }
    

    }

  3. Parse Verification Code that come through SMS.

    private String getVerificationCode(String message) { String code = null; int index = message.indexOf(Config.OTP_DELIMITER);

    if (index != -1) {
        int start = index + 2;
        int length = 6;
        code = message.substring(start, start + length);
        return code;
    }
    
    return code;
    

    }

Upvotes: 0

MedAmine.Rihane
MedAmine.Rihane

Reputation: 1213

You can just use Split function to get your last 5 numbers :

String[] splited = body.split(":");
String mylastnum= splited[1];
number.settext(mylastnum); 

hope it help !

Upvotes: 1

Abhishek Patel
Abhishek Patel

Reputation: 4328

Try this it may be help to you

public static String GENERAL_OTP_TEMPLATE = "Your verification code: (.*).";

SmsMessage[] message = new SmsMessage[objectArray.length];
for (int i = 0; i < objectArray.length; i++) {
    message[i] = SmsMessage.createFromPdu((byte[]) objectArray[i]);

}
Pattern generalOtpPattern = Pattern.compile(GENERAL_OTP_TEMPLATE);
Matcher generalOtpMatcher = generalOtpPattern.matcher(message[0].getMessageBody().toString());

if (generalOtpMatcher.find()) {
       String otp = generalOtpMatcher.group(1);
       number.setText(otp);
}

Upvotes: 1

Related Questions