
Hi Android developer in this android blog i am making a example for Android Read OTP Automatically Using Broadcast Receiver. Like you can see the most of android app and banking app read your otp automatically. When the OTP come your phone auto read it and fill the OTP in the Edit Text auto.
Similar In this example you can learn how to read OTP Automatically in android. In this example i create a screen with edit text and button. When you receive an otp its auto read and showing on edit text filed.
So Let’s Start the Example
How to auto read OTP in Android programmatically
Start your android studio and create a project. Add the google dependencies play-services-auth and play-services-auth-api-phone and syn your project.
dependencies {
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.3.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'com.google.android.gms:play-services-auth:19.0.0'
implementation 'com.google.android.gms:play-services-auth-api-phone:17.5.0'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}
Step 2 : Create UI for OTP Screen XML code
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:text="AUTO READ OTP"
android:textColor="@color/black"
android:textSize="26dp"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="248dp"
android:text="Please Enter your OTP"
android:textColor="@color/black"
android:textSize="16dp"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView" />
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/outlinedTextField"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="26dp"
android:layout_marginTop="30dp"
android:hint="Please enter the OTP"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView2">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/etOTP"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</com.google.android.material.textfield.TextInputLayout>
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@+id/textView2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView"
app:srcCompat="@drawable/plugins_email_verification" />
<Button
android:id="@+id/loginbtn"
android:layout_width="0dp"
android:layout_height="70dp"
android:layout_marginTop="68dp"
android:layout_marginHorizontal="26dp"
android:text="Send"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:textSize="26dp"
app:layout_constraintTop_toBottomOf="@+id/outlinedTextField" />
</androidx.constraintlayout.widget.ConstraintLayout>
Step : 3 Open your MainActivity OTP Class.
In your main activity call you can call the Broadcast Receiver for reading the msg otp auto.
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import com.google.android.gms.auth.api.phone.SmsRetriever;
import com.google.android.gms.auth.api.phone.SmsRetrieverClient;
import com.google.android.material.textfield.TextInputEditText;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MainActivity extends AppCompatActivity {
private static final int REQ_USER_CONSENT = 200;
SmsBroadcastReceiver smsBroadcastReceiver;
TextInputEditText etOTP;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etOTP = findViewById(R.id.etOTP);
startSmartUserConsent();
}
private void startSmartUserConsent() {
SmsRetrieverClient client = SmsRetriever.getClient(this);
client.startSmsUserConsent(null);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQ_USER_CONSENT){
if ((resultCode == RESULT_OK) && (data != null)){
String message = data.getStringExtra(SmsRetriever.EXTRA_SMS_MESSAGE);
getOtpFromMessage(message);
}
}
}
private void getOtpFromMessage(String message) {
Pattern otpPattern = Pattern.compile("(|^)\\d{6}");
Matcher matcher = otpPattern.matcher(message);
if (matcher.find()){
etOTP.setText(matcher.group(0));
}
}
private void registerBroadcastReceiver(){
smsBroadcastReceiver = new SmsBroadcastReceiver();
smsBroadcastReceiver.smsBroadcastReceiverListener = new SmsBroadcastReceiver.SmsBroadcastReceiverListener() {
@Override
public void onSuccess(Intent intent) {
startActivityForResult(intent,REQ_USER_CONSENT);
}
@Override
public void onFailure() {
}
};
IntentFilter intentFilter = new IntentFilter(SmsRetriever.SMS_RETRIEVED_ACTION);
registerReceiver(smsBroadcastReceiver,intentFilter);
}
@Override
protected void onStart() {
super.onStart();
registerBroadcastReceiver();
}
@Override
protected void onStop() {
super.onStop();
unregisterReceiver(smsBroadcastReceiver);
}
}
Android Read OTP Automatically Using Broadcast Receiver
Step 4 Create a Broadcast Receiver class
Create a broadcast receiver for Android read otp Automatically. When sms received broadcast receiver read the msg otp auto.
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
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;
public class SmsBroadcastReceiver extends BroadcastReceiver {
public SmsBroadcastReceiverListener smsBroadcastReceiverListener;
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction() == SmsRetriever.SMS_RETRIEVED_ACTION){
Bundle extras = intent.getExtras();
Status smsRetreiverStatus = (Status) extras.get(SmsRetriever.EXTRA_STATUS);
switch (smsRetreiverStatus.getStatusCode()){
case CommonStatusCodes
.SUCCESS:
Intent messageIntent = extras.getParcelable(SmsRetriever.EXTRA_CONSENT_INTENT);
smsBroadcastReceiverListener.onSuccess(messageIntent);
break;
case CommonStatusCodes.TIMEOUT:
smsBroadcastReceiverListener.onFailure();
break;
}
}
}
public interface SmsBroadcastReceiverListener{
void onSuccess(Intent intent);
void onFailure();
}
}
After complete all above steps run your app and wait app run. When app run successfully send a otp on the number added in phone you can see app asking you a permission for reading sms after allow you otp auto set on edit text filed.





