OTP (token) should be automatically read from the message

前端 未结 7 857
栀梦
栀梦 2020-12-04 10:50

I am working on an Android App, in which the server sends an OTP and the user needs to enter this OTP in the App, to SignUp for my App. What I want is, that my App should be

7条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2020-12-04 11:43

    Sorry for late reply but still felt like posting my answer if it helps.It works for 6 digits OTP.

        @Override
        public void onOTPReceived(String messageBody)
        {
            Pattern pattern = Pattern.compile(SMSReceiver.OTP_REGEX);
            Matcher matcher = pattern.matcher(messageBody);
            String otp = HkpConstants.EMPTY;
            while (matcher.find())
            {
                otp = matcher.group();
            }
            checkAndSetOTP(otp);
        }
    Adding constants here
    
    public static final String OTP_REGEX = "[0-9]{1,6}";
    

    For SMS listener one can follow the below class

    public class SMSReceiver extends BroadcastReceiver
    {
        public static final String SMS_BUNDLE = "pdus";
        public static final String OTP_REGEX = "[0-9]{1,6}";
        private static final String FORMAT = "format";
    
        private OnOTPSMSReceivedListener otpSMSListener;
    
        public SMSReceiver(OnOTPSMSReceivedListener listener)
        {
            otpSMSListener = listener;
        }
    
        @Override
        public void onReceive(Context context, Intent intent)
        {
            Bundle intentExtras = intent.getExtras();
            if (intentExtras != null)
            {
                Object[] sms_bundle = (Object[]) intentExtras.get(SMS_BUNDLE);
                String format = intent.getStringExtra(FORMAT);
                if (sms_bundle != null)
                {
                    otpSMSListener.onOTPSMSReceived(format, sms_bundle);
                }
                else {
                    // do nothing
                }
            }
        }
    
        @FunctionalInterface
        public interface OnOTPSMSReceivedListener
        {
            void onOTPSMSReceived(@Nullable String format, Object... smsBundle);
        }
    }
    
        @Override
        public void onOTPSMSReceived(@Nullable String format, Object... smsBundle)
        {
            for (Object aSmsBundle : smsBundle)
            {
                SmsMessage smsMessage = getIncomingMessage(format, aSmsBundle);
                String sender = smsMessage.getDisplayOriginatingAddress();
                if (sender.toLowerCase().contains(ONEMG))
                {
                    getIncomingMessage(smsMessage.getMessageBody());
                } else
                {
                    // do nothing
                }
            }
        }
    
        private SmsMessage getIncomingMessage(@Nullable String format, Object aObject)
        {
            SmsMessage currentSMS;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && format != null)
            {
                currentSMS = SmsMessage.createFromPdu((byte[]) aObject, format);
            } else
            {
                currentSMS = SmsMessage.createFromPdu((byte[]) aObject);
            }
    
            return currentSMS;
        }
    

提交回复
热议问题