OTP (token) should be automatically read from the message –

Step 3) Add a listener, i.e. a radio receiver, to the android manifest file.

and add a resolution


Final step 4) The activity where you receive the mail automatically when it arrives in your inbox. In my case, I get a print and a setting in the text editing area.

The public class OtpVerificationActivity extends AppCompatActivity {
EditText ed;
TextView tv;
String otp_generated,contactNo,id1;
GlobalData gd = new GlobalData();
protected void onCreate(Bundle savedInstanceState) {
tv=(TextView) findViewById(R.id.)verify_otp);
/*This one is important because it will be used every time you send an SMS
SmsReceiver.bindListener(new SmsListener() {
public void message Received (String messageText) {
tv.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
InputMethodManager imm=
catch(Exception e)
if (ed.getText().toString().equal(otp_generated))
Toast.makeText(OtpVerificationActivity.this, OTP Verified
Successful! Toast.LENGTH_SHORT).show();

Presentation file for the Otp verification activity

Screenshots of the WBS check activity where you receive the WBS as

Solution 2:

You could try to use a simple library such as

After installing by arranging and adding permissions, run SmsVerifyCatcher in a method such as onCreate :

smsVerifyCatcher = new SmsVerifyCatcher(this, new OnSmsCatchListener() {
public void onSmsCatch(String message) {
String code = parseCode(message);//Display verification code
enCode.setText(code);//Set the code in the edited text
// then you can send the verification code to the server

In addition, life support measures are removed:

protected void onStart() {

protected void onStop() {

* Need Android 6 real-time permissions
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult (requestCode, permissions, grantResults);
smsVerifyCatcher.onRequestPermissionsResult (requestCode, permissions, grantResults);

public String parseCode(String message) {
Pattern p = Pattern.compile(\{4}b);
Matcher m = p.matcher(message);
String code = ;
while (m.find()) {
code = m.group(0);
return code;

Solution 3:

Since Google has restricted the use of the READ_SMS permission, here is the solution without READ_SMS permission.

SMS retriever API

Its main function is to avoid using Android’s critical resolution READ_SMS and perform the task using this method. The effects are the steps you need.

Send OTP to the user number, check whether the SMS Retriever API can receive the message or not.

SmsRetrieverClient client = SmsRetriever.getClient(SignupSetResetPasswordActivity.this);
task = client.startSmsRetriever();
task.addOnSuccessListener(new OnSuccessListener() {
public void onSuccess(Void aVoid) {
// Android executes the message after receiving it. Starts the broadcast receiver.
IntentFilter filter = new IntentFilter();
registerReceiver(new SmsReceiver(), filter);
task.addOnFailureListener(new OnFailureListener() {
public void onFailure(@NonNull Exception e)) {
// Retriever did not start, see exception for details
}) ;

Radio receiver code

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle ;

import com.google.android.gms.auth.api.phone.SmsRetriever ;
import com.google.android.gms.common.api.CommonStatusCodes ;
import com.google.android.gms.common.api.Status ;

the SmsReceiver public class extends BroadcastReceiver {

public void onReceive(context, intent) {
if (SmsRetriever.SMS_RETRIEVED_ACTION.equals(intent.getAction()) {
Augment package = intent.getExtras() ;
status = (status) Augment.get(SmsRetriever.EXTRA_STATUS) ;

{ status.getStatusCode()} {
Cases CommonStatusCodes.SUCCESS :
// Retrieve the contents of the SMS message
String otp;
String msgs = (String) extraas.get(SmsRetriever.EXTRA_SMS_MESSAGE) ;

// Extraction of the unique code from the message and full verification
instances CommonStatusCodes.TIMEOUT :
// Wait for SMS message with timer (5 minutes)// Error handling …pause;}}}}}

The final phase. Enter this recipient in your manifest

Your SMS message should look like this

Your WBS code: 6789

Here, QWsa8754qw2 is your own 11-digit application hash code. Follow this link

  • Be less than 140 bytes
  • Start with the prefix <#>.
  • It ends with an 11-character hash string that identifies your request.

To import com.google.android.gms.auth.phone.SmsRetriever, you need to add this line to your build.gradle application:

Implementation com.google.android.gms:play-services-auto-api phone:16.0.0

Solution 4:

I implemented some of it. But here’s what I did: when a message comes in, I get a six-digit code, associate it with the intent and send it to the appropriate event or extract the code and check it. The example already shows how to receive SMS. See the following code to illustrate how to broadcast with LocalBrodcastManager. If your message contains more text, e. B. Greetings, you should standardize them to help you better. For example, your verification code: 84HG73 you can use this regression model ([0-9]){2}([A-Z]){2}([0-9]){2} which means two inches, two [uppercase] and two inches. Good luck!

Once you have removed all unnecessary information from the message, perform the following steps.

Intent = new intent (AddedItem);
intent.putExtra(items, code);
LocalBroadcastManager.getInstance(getActivity()).sendBroadcast(intent) ;

And the fragmentation/activity it receives

public void opResume() {
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(receiver, new IntentFilter(AddedItem));

public void onPause() {

And a code designed for the assembled cargo.

private BroadcastReceiver receiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context, intent) {if (intent.getAction()) {final String message = intent.getStringExtra(message);// do anything you want with the code here}}}}

That helps a little. I did better by using memories…

Solution no. 5:

I apologize for the late response, but I’d still like to post my answer if it helps. It works for the 6-digit WBS.

public void onOTPReived(String messageBody)
Pattern = Pattern.compile(SMSReceiver.OTP_REGEX);
Matcher matcher = pattern.matcher(messageBody);
String otp = HkpConstants.EMPTY;
while (matcher.find())
otp = matcher.group();
Add constants here.

public static string OTP_REGEX = [0-9]{1,6} ;

The following class can be used for the SMS listener

public class SMSReceiver extends BroadcastReceiver
public static end string SMS_BUNDLE = pdus ;
public static end string OTP_REGEX = [0-9]{1,6} ;
private static end string FORMAT = format ;

Private OnOTPSMSReceivedListener otpSMSListener ;

public SMSReceiver (OnOTPSMSReceivedListener)
otpSMSListener = listener ;

public void onReceive(Context, intent)
Bundle intentExtras = intent.getExtras();
if (intExtras != null)
Object[] sms_bundle = (Object[]) intentExtras.get(SMS_BUNDLE);
String format = intent.getStringExtra(FORMAT);
if (sms_bundle != null)
otpSMSListener.onOTPSMSReceived(format, sms_bundle);
otherwise {
// do nothing

public interface OnOTPSMSReceivedListener
void onOTPSMSReceived(@Nullable String format, Object… smsBundle);

@Generalpublic void onOTPSMS Receive (@format Nullable String, Object… smsBundle){for (Object aSmsBundle : smsBundle){SmsMessage smsMessage = getIncomingMessage (@format Nullable String, Object… smsBundle);String sender = smsMessage.getDisplayOriginatingAddress();if (sender.toLowerCase().contains(ONEMG))){getI9 getIncomingMessage(smsMessage.getMessageBody());} else{// do nothing}}}}

private SmsMessage getIncomingMessage(@Format Nullable String, Object aObject)
SmsMessage currentSMS;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && format !=
currentSMS = SmsMessage.createFromPdu((byte[]) aObject, format);
} else
currentSMS = SmsMessage.createFromPdu((byte[]) aObject);

reverse flow SMS;

Solution no. 6:

With SMS API Retriever, you can read OTP without declaring android.permission.READ_SMS.

Launching SMS Retriever

private fun startSMSRetriever() {
// Get the SmsRetrieverClient instance used to start listening to the corresponding SMS.
val client = SmsRetriever.getClient(this /* context */) ;

// Starts waiting for ONE corresponding SMS message until timeout
// (5 minutes). The corresponding SMS message is sent via the broadcast event with action
// SmsRetriever#SMS_RETRIEVED_ACTION. task
trap : Task = client.startSmsRetriever() ;

// Listen for the success/failure of starting the task. If in the background thread, this can be
// blocked with Tasks.wait(task, [timeout]);
task.addOnSuccessListener {
Log.d(SmsRetriever, SmsRetriever Start Success)

task.addOnFailureListener {
Log.d(SmsRetriever, SmsRetriever Disturbed)

Reception of broadcast messages

public class MySMSBroadcastReceiver : BroadcastReceiver() {

Override fun onReceive(context: Context?, intent: intent?) {
if (SmsRetriever.SMS_RETRIEVED_ACTION == intent?.action && intent.extraas! =null) {
trap extraas = intent.extraas
trap status = extraas.get(SmsRetriever.EXTRA_STATUS) if Status

when (status.statusCode) {
CommonStatusCodes.SUCCESS -> {
// Retrieve the contents of an SMS message
val message = extraas.get(SmsRetriever.EXTRA_SMS_MESSAGE) as string
Log.e(Message, message);
// Retrieve the unique code of the message and perform the
check // Send the code back to the server.

CommonStatusCodes.TIMEOUT -> {// Wait for SMS message with timer (5 min)// Error handling …}}}}}


/**Don’t forget to set BroadcastReceiver in AndroidManifest.xml.*/.

Send the unique code from the verification message to your server.

Make sure the format of your SMS is exactly as below:

Your sample codeApp : 123ABC78

  1. Be less than 140 bytes
  2. Start with the prefix <#>.
  3. It ends with an 11-character hash string that identifies your request.

You can calculate the hash of the request with the following code :

import android.content.Context
import android.content.ContextWrapper
import android.content.pm.PackageManager
import android.util.Base64 import
import java.nio.charset.StandardCharsets
import java.security.MessageDigest
import java.security.NoSuchAlgorithmException
import java.util.*.

public class AppSignatureHelper (private val context: Context) : ContextWrapper(context) {

companion object {
val TAG = AppSignatureHelper::class.java.simpleName ;

private const trap HASH_TYPE = SHA-256;
const trap NUM_HASHED_BYTES = 9;
const trap NUM_BASE64_CHAR = 11;

public getAppSignatures() fun : ArrayList {
val appCodes = ArrayList() ;


val signatures = packageManager.getPackageInfo(
).signature ;

for (signature in signature) {
val hash = hash(packageName, signature.toCharsString());
if (hash != null) {
appCodes.add(String.format(%s, hash));
} catch(e: PackageManager.NameNotFoundException) {
Log.e(TAG, Cannot find package to get hash, e);
returned appCodes;

private pleasure hash (package name: String, caption: String) : String ? {
val appInfo = $packetname $Signature ;
try {
val messageDigest = MessageDigest.getInstance(HASH_TYPE) ;
messageDigest.update(appInfo.toByteArray(StandardCharsets.UTF_8)) ;
var hashSignature = messageDigest.digest() ;

hashSignature = Arrays.copyOfRange(hashSignature, 0, NUM_HASHED_BYTES) ;

var base64Hash = Base64.encodeToString(hashSignature, Base64.NO_PADDING or Base64.NO_WRAP);
base64Hash = base64Hash.substring(0, NUM_BASE64_CHAR) ;

Log.e(TAG, String.format(pkg: %s — hash: %s, packageName, base64Hash));
return base64Hash;
} catch (e: NoSuchAlgorithmException) {
Log.e(TAG, hash:NoSuchAlgorithm, e);
return zero;

Charging station required :

Implementation com.google.android.gms:play-services-auto-api phone:16.0.0


Solution no. 7:

Yes, this is now possible in browsers. Chrome unlocks this feature starting with version 84. Thanks to the WEBOTP API, we can detect the WBS in the mobile device network.

Here, the OTP web code is integrated with the angular PWA applications: https://github.com/Rohit3230/webOtpAutoReadByAngular.

Access the working URL of the PWA corner application. https://rohit3230.github.io/webOtpAutoReadByAngular/.

Solution no. 8:


import android.content.BroadcastReceiver;
import android.content.IntentFilter;
import android.support.v7.app.App.AppCompatActivity;
import android.os.Bundle ;

The MainActivity public class extends the AppCompatActivity {.

private BroadcastReceiver broadcastReceiver;
protected void onCreate(Bundle storedInstanceState) {
broadcastReceiver =new MyBroadcastReceiver();

protected void onStart()
IntentFilter intentFilter=new IntentFilter(android.provider.Telephony.SMS_RECUE);
protected void onStop()



import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.intention;
import android.widget.Toast ;

* Created by mukundwn on 12/02/18.

public class MyBroadcastReceiver extends BroadcastReceiver {

public void onReceive(Context context, intent) {
Toast.makeText(context,hello received a text message,Toast.LENGTH_SHORT).show();


Good luck!

 sms retriever apiauto detect otp android example githubsms-retriever api react-nativesms retriever api android not workingsms verification code autofillandroid mobile number verification examplesms verification code onlineread otp from sms android kotlinread_sms permission androidautomatic otp verification in react nativesms retriever api flutterautofill otp in android settingssms retriever api ionicautofill code from messages iphoneotp autofill flutterautofill 2faotpreaderandroid otp tutorialautofetch otp androidhow to get otp on screensmsverifycatcher androidreading incoming message automatically in android to verify otp githubextract otp from sms androidhow to stop automatic reading of otpauto read otp not workingandroid read otp without sms permissionauto read otp flutter

You May Also Like