OTP Verification using Firebase in Android Studio
gradle.build (project)
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:4.1.3"
classpath 'com.google.gms:google-services:4.3.10'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
gradle.build (app)
plugins {
id 'com.android.application'
id 'com.google.gms.google-services'
}
android {
compileSdkVersion 30
buildToolsVersion "30.0.0"
defaultConfig {
applicationId "com.learnoset.otpverification"
minSdkVersion 19
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.0'
testImplementation 'junit:junit:4.13.2'
implementation platform('com.google.firebase:firebase-bom:28.4.0')
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
implementation 'com.google.firebase:firebase-auth'
}
google-services.json
// Replace this file with your own google-services.json otherwise you may get errors in your project
{
"project_info": {
"project_number": "248125923302",
"project_id": "otpverification-dd9a6",
"storage_bucket": "otpverification-dd9a6.appspot.com"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:248125923302:android:210ed50bef84ceba74c027",
"android_client_info": {
"package_name": "com.learnoset.otpverification"
}
},
"oauth_client": [
{
"client_id": "248125923302-lo8f92n4ar666i6pp8e5qg1cu5088cuo.apps.googleusercontent.com",
"client_type": 1,
"android_info": {
"package_name": "com.learnoset.otpverification",
"certificate_hash": "ce5dbf10dd6cb3a8952c3fde991ee53a45caa940"
}
},
{
"client_id": "248125923302-mkgq3pnmhma01h985qa89nuu4aijrj7g.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyDD_mUfk7BHS6ED18iztolEjPx841hKZvE"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "248125923302-mkgq3pnmhma01h985qa89nuu4aijrj7g.apps.googleusercontent.com",
"client_type": 3
}
]
}
}
}
],
"configuration_version": "1"
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.learnoset.otpverification">
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:usesCleartextTraffic="true"
android:theme="@style/Theme.OTPVerification">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical"
android:gravity="center"
android:layout_height="match_parent"
tools:context=".MainActivity">
<EditText
android:id="@+id/mobileET"
android:inputType="phone"
android:maxLines="1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Enter Mobile Number"/>
<EditText
android:visibility="gone"
android:id="@+id/otpET"
android:inputType="number"
android:maxLines="1"
android:layout_marginTop="20dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Enter OTP"/>
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/actionBtn"
android:layout_marginTop="20dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Send Otp"/>
</LinearLayout>
MainActivity.java
package com.learnoset.otpverification;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.FirebaseApp;
import com.google.firebase.FirebaseException;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.auth.PhoneAuthCredential;
import com.google.firebase.auth.PhoneAuthOptions;
import com.google.firebase.auth.PhoneAuthProvider;
import java.util.concurrent.TimeUnit;
public class MainActivity extends AppCompatActivity {
private boolean otpSent = false;
private String countryCode = "+91";
private String id = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText mobileET = findViewById(R.id.mobileET);
final EditText otpET = findViewById(R.id.otpET);
final Button actionBtn = findViewById(R.id.actionBtn);
FirebaseApp.initializeApp(this);
FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
actionBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(otpSent){
final String getOTP = otpET.getText().toString();
if(id.isEmpty()){
Toast.makeText(MainActivity.this, "Unable to verify OTP", Toast.LENGTH_SHORT).show();
}
else{
PhoneAuthCredential credential = PhoneAuthProvider.getCredential(id, getOTP);
firebaseAuth.signInWithCredential(credential).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if(task.isSuccessful()){
FirebaseUser userDetails = task.getResult().getUser();
Toast.makeText(MainActivity.this, "Verified", Toast.LENGTH_SHORT).show();
}
else{
Toast.makeText(MainActivity.this, "Something went wrong!!!", Toast.LENGTH_SHORT).show();
}
}
});
}
}
else{
final String getMobile = mobileET.getText().toString();
PhoneAuthOptions options = PhoneAuthOptions.newBuilder(firebaseAuth)
.setPhoneNumber(countryCode+""+getMobile)
.setTimeout(60L, TimeUnit.SECONDS)
.setActivity(MainActivity.this)
.setCallbacks(new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
@Override
public void onVerificationCompleted(@NonNull PhoneAuthCredential phoneAuthCredential) {
Toast.makeText(MainActivity.this, "OTP sent successfully", Toast.LENGTH_SHORT).show();
}
@Override
public void onVerificationFailed(@NonNull FirebaseException e) {
Toast.makeText(MainActivity.this, "Something went wrong "+e.getMessage(), Toast.LENGTH_SHORT).show();
}
@Override
public void onCodeSent(@NonNull String s, @NonNull PhoneAuthProvider.ForceResendingToken forceResendingToken) {
super.onCodeSent(s, forceResendingToken);
otpET.setVisibility(View.VISIBLE);
actionBtn.setText("Verify OTP");
id = s;
otpSent = true;
}
}).build();
PhoneAuthProvider.verifyPhoneNumber(options);
}
}
});
}
}
Projects with Source Code + Video Tutorials
You can download our Java and Android Studio Projects with Source Code and Video Tutorials.
HD Wallpaper App in Android Studio
Simple Calculator App for Android
Complete Chat Application Using Firebase Database
If you have any Questions or Queries
You can mail us at info.learnoset@gmail.com
Follow us to learn Coding and get in touch with new Technologies.