IMAGE TO TEXT SCANNER APP IN ANDROID STUDIO | TEXT RECOGNITION APP
In this Android Tutorial, I am going to give you the Source Code of the Image to Text Scanner App in Android Studio or you Can Say that the Text Recognition App in Android Studio.
We are going to create Splash Screen, Dashboard, Taking Images from Device or Camera, Notification, Analytics, In-app Messaging, Performance.
Share Button, Navigation Drawer, Checking Internet Connection, Copy the Text Button, Exit Confirmation, and many more... In our Image to Text app in Android Studio.
SplashScreen.java
package android.tutorials.textscannerapp;
import androidx.appcompat.app.AppCompatActivity;
import android.app.ActionBar;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.view.WindowManager;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.TextView;
public class SplashScreenActivity extends AppCompatActivity {
TextView title, credit;
ImageView logo;
Animation topAnim;
Animation buttomAnim;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_splash_screen);
logo = findViewById(R.id.logo);
title = findViewById(R.id.title);
credit = findViewById(R.id.credit);
topAnim = AnimationUtils.loadAnimation(this,R.anim.top_animation);
buttomAnim = AnimationUtils.loadAnimation(this,R.anim.bottom_animation);
logo.setAnimation(topAnim);
title.setAnimation(buttomAnim);
credit.setAnimation(buttomAnim);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(SplashScreenActivity.this, DashboardActivity.class);
startActivity(intent);
finish();
}
}, 3000);
}
}
ImageActivity.java
package android.tutorials.textscannerapp;
import android.Manifest;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.util.SparseArray;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import com.google.android.gms.vision.Frame;
import com.google.android.gms.vision.text.TextBlock;
import com.google.android.gms.vision.text.TextRecognizer;
import com.theartofdev.edmodo.cropper.CropImage;
import com.theartofdev.edmodo.cropper.CropImageView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import com.google.android.material.textfield.TextInputLayout;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ImageActivity extends AppCompatActivity {
TextInputLayout textInputLayout;
EditText mResultEt;
ImageView mPreviewIv;
Button copy, share, download;
Toolbar toolbar;
private static final int STORAGE_REQUEST_CODE = 400;
private static final int IMAGE_PICK_GALLERY_CODE = 1000;
String[] storagePermission;
String fileName;
File rootPath;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.result_activity);
toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setTitle("Camera Result");
// getSupportActionBar().setSubtitle("OCR TEXT SCANNED RESULT");
mResultEt = findViewById(R.id.resultEt);
mPreviewIv = findViewById(R.id.imageIv);
storagePermission = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE};
if (!checkStoragePermission()) {
requestStoragePermission();
} else {
pickGallery();
}
copy = findViewById(R.id.copy);
copy.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String s = mResultEt.getText().toString();
ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clipQuote = ClipData.newPlainText("OCR TEXT COPIED", s);
clipboardManager.setPrimaryClip(clipQuote);
Toast.makeText(ImageActivity.this, "OCR TEXT COPIED !", Toast.LENGTH_SHORT).show();
}
});
share = findViewById(R.id.share);
share.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String s = mResultEt.getText().toString();
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, s);
startActivity(Intent.createChooser(intent, "Share using"));
}
});
}
private String getFileName() {
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd_HHmmss");
Date date = new Date();
String timeStamp = format.format(date);
fileName = "OCR_Text_" + timeStamp + ".txt";
return fileName;
}
private void pickGallery() {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, IMAGE_PICK_GALLERY_CODE);
}
private void requestStoragePermission() {
ActivityCompat.requestPermissions(this, storagePermission, STORAGE_REQUEST_CODE);
}
private boolean checkStoragePermission() {
boolean result = ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE) == (PackageManager.PERMISSION_GRANTED);
return result;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == STORAGE_REQUEST_CODE) {
if (grantResults.length > 0) {
boolean writeStorageAccepted = grantResults[0] == PackageManager.PERMISSION_GRANTED;
if (writeStorageAccepted) {
pickGallery();
} else {
Toast.makeText(this, "Permission Denied", Toast.LENGTH_SHORT).show();
}
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if (resultCode == RESULT_OK) {
if (requestCode == IMAGE_PICK_GALLERY_CODE) {
CropImage.activity(data.getData()).setGuidelines(CropImageView.Guidelines.ON)
.start(this);
}
}
if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) {
CropImage.ActivityResult result = CropImage.getActivityResult(data);
if (resultCode == RESULT_OK) {
Uri resultUri = result.getUri();
mPreviewIv.setImageURI(resultUri);
BitmapDrawable bitmapDrawable = (BitmapDrawable) mPreviewIv.getDrawable();
Bitmap bitmap = bitmapDrawable.getBitmap();
TextRecognizer recognizer = new TextRecognizer.Builder(getApplicationContext()).build();
if (!recognizer.isOperational()) {
Toast.makeText(this, "Error", Toast.LENGTH_SHORT).show();
} else {
Frame frame = new Frame.Builder().setBitmap(bitmap).build();
SparseArray<TextBlock> items = recognizer.detect(frame);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < items.size(); i++) {
TextBlock myItem = items.valueAt(i);
sb.append(myItem.getValue());
sb.append("\n");
}
mResultEt.setText(sb.toString());
}
} else if (resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE) {
Exception exception = result.getError();
Toast.makeText(this, "" + exception, Toast.LENGTH_SHORT).show();
}
}
super.onActivityResult(requestCode, resultCode, data);
}
@Override
public void onBackPressed() {
Intent intent = new Intent(this, DashboardActivity.class);
startActivity(intent);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu, menu);
return super.onCreateOptionsMenu(menu);
}
public void onShare(MenuItem item) {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
String shareLink = "Download this best OCR Text Scanner app and also gives accurate results Download it from the given link \n" +
"https://play.google.com/store/apps/details?id=" + getApplicationContext().getPackageName();
intent.putExtra(Intent.EXTRA_TEXT, shareLink);
startActivity(Intent.createChooser(intent, "Share using"));
}
public void onRate(MenuItem item) {
Uri uri = Uri.parse("https://play.google.com/store/apps/details?id=" + getApplicationContext().getPackageName());
Intent rateIntent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(rateIntent);
}
}
DashboardActivity.java
package android.tutorials.textscannerapp;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuItem;
import com.google.android.material.navigation.NavigationView;
public class DashboardActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
Toolbar toolbar;
DrawerLayout drawerLayout;
NavigationView navigationView;
ActionBarDrawerToggle toggle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dashboard);
toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setTitle("Text Scanner");
//getSupportActionBar().setSubtitle("by Android Tutorials");
drawerLayout = findViewById(R.id.drawerLayout);
toggle = new ActionBarDrawerToggle(DashboardActivity.this, drawerLayout, R.string.open, R.string.close);
navigationView= findViewById(R.id.navigationView);
drawerLayout.addDrawerListener(toggle);
toggle.syncState();
navigationView.bringToFront();
navigationView.setCheckedItem(R.id.home);
navigationView.setNavigationItemSelectedListener(this);
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if (toggle.onOptionsItemSelected(item)){
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onBackPressed() {
if (drawerLayout.isDrawerOpen(GravityCompat.START)){
drawerLayout.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.home:
drawerLayout.closeDrawer(GravityCompat.START);
break;
case R.id.image:
Intent image = new Intent(DashboardActivity.this, ImageActivity.class);
startActivity(image);
break;
case R.id.camera:
Intent camera = new Intent(DashboardActivity.this, CameraActivity.class);
startActivity(camera);
break;
case R.id.feedback:
Intent feedback = new Intent(Intent.ACTION_SENDTO);
feedback.setData(Uri.parse("mailto:"));
String[] mail = {"jayeshbhaikaklotar26@gmail.com"};
String subject = "Feedback on Text Scanner // Feedback on Android Tutorials";
String text = "Feedback on Text Scanner or Feedback on Android Tutorials YT Channel ";
feedback.putExtra(Intent.EXTRA_SUBJECT,subject);
feedback.putExtra(Intent.EXTRA_TEXT,text);
feedback.putExtra(Intent.EXTRA_EMAIL,mail);
startActivity(feedback);
break;
case R.id.share:
Intent share = new Intent(Intent.ACTION_SEND);
share.setType("plain/text");
String shareLink = "https://play.google.com/store/apps/details?id="+ getApplicationContext().getPackageName();
share.putExtra(Intent.EXTRA_TEXT,shareLink);
startActivity(Intent.createChooser(share,"Share Using"));
break;
case R.id.rate:
Uri uri = Uri.parse("https://play.google.com/store/apps/details?id="+ getApplicationContext().getPackageName());
Intent rate = new Intent(Intent.ACTION_VIEW,uri);
startActivity(rate);
break;
}
return true;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu,menu);
return super.onCreateOptionsMenu(menu);
}
public void onShare(MenuItem item) {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("plain/text");
String shareLink = "https://play.google.com/store/apps/details?id="+ getApplicationContext().getPackageName();
intent.putExtra(Intent.EXTRA_TEXT,shareLink);
startActivity(intent);
}
public void onRate(MenuItem item) {
Uri uri = Uri.parse("https://play.google.com/store/apps/details?id="+ getApplicationContext().getPackageName());
Intent intent = new Intent(Intent.ACTION_VIEW,uri);
startActivity(intent);
}
}
CameraActivity.java
package android.tutorials.textscannerapp;
import android.Manifest;
import android.content.ContentValues;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.SparseArray;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import com.google.android.gms.vision.Frame;
import com.google.android.gms.vision.text.TextBlock;
import com.google.android.gms.vision.text.TextRecognizer;
import com.google.android.material.textfield.TextInputLayout;
import com.theartofdev.edmodo.cropper.CropImage;
import com.theartofdev.edmodo.cropper.CropImageView;
import java.text.SimpleDateFormat;
import java.util.Date;
public class CameraActivity extends AppCompatActivity {
EditText mResultEt;
ImageView mPreviewIv;
Toolbar toolbar;
private static final int CAMERA_REQUEST_CODE = 200;
private static final int IMAGE_PICK_CAMERA_CODE = 1001;
String fileName;
String[] cameraPermission;
Button button;
Uri image_uri;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.result_activity);
toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setTitle("Camera Result");
// getSupportActionBar().setSubtitle("OCR TEXT SCANNED RESULT");
cameraPermission = new String[]{Manifest.permission.CAMERA,
Manifest.permission.WRITE_EXTERNAL_STORAGE};
if (!checkCameraPermission()) {
requestCameraPermission();
} else {
pickCamera();
}
}
private String getFileName() {
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd_HHmmss");
Date date = new Date();
String timeStamp = format.format(date);
fileName = "OCR_Text_" + timeStamp + ".txt";
return fileName;
}
private void pickCamera() {
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.TITLE, "NewPic");
values.put(MediaStore.Images.Media.DESCRIPTION, "Image to text");
image_uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, image_uri);
startActivityForResult(cameraIntent, IMAGE_PICK_CAMERA_CODE);
}
private void requestCameraPermission() {
ActivityCompat.requestPermissions(this, cameraPermission, CAMERA_REQUEST_CODE);
}
private boolean checkCameraPermission() {
boolean result = ContextCompat.checkSelfPermission(this,
Manifest.permission.CAMERA) == (PackageManager.PERMISSION_GRANTED);
boolean result1 = ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE) == (PackageManager.PERMISSION_GRANTED);
return result && result1;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == CAMERA_REQUEST_CODE) {
if (grantResults.length > 0) {
boolean cameraAccpeted = grantResults[0] == PackageManager.PERMISSION_GRANTED;
boolean writeStorageAccepted = grantResults[0] == PackageManager.PERMISSION_GRANTED;
if (cameraAccpeted && writeStorageAccepted) {
pickCamera();
} else {
Toast.makeText(this, "Permission Denied", Toast.LENGTH_SHORT).show();
}
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if (resultCode == RESULT_OK) {
if (requestCode == IMAGE_PICK_CAMERA_CODE) {
CropImage.activity(image_uri).setGuidelines(CropImageView.Guidelines.ON)
.start(this);
}
}
if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) {
CropImage.ActivityResult result = CropImage.getActivityResult(data);
if (resultCode == RESULT_OK) {
Uri resultUri = result.getUri();
mPreviewIv.setImageURI(resultUri);
BitmapDrawable bitmapDrawable = (BitmapDrawable) mPreviewIv.getDrawable();
Bitmap bitmap = bitmapDrawable.getBitmap();
TextRecognizer recognizer = new TextRecognizer.Builder(getApplicationContext()).build();
if (!recognizer.isOperational()) {
Toast.makeText(this, "Error", Toast.LENGTH_SHORT).show();
} else {
Frame frame = new Frame.Builder().setBitmap(bitmap).build();
SparseArray<TextBlock> items = recognizer.detect(frame);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < items.size(); i++) {
TextBlock myItem = items.valueAt(i);
sb.append(myItem.getValue());
sb.append("\n");
}
mResultEt.setText(sb.toString());
}
} else if (resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE) {
Exception exception = result.getError();
Toast.makeText(this, "" + exception, Toast.LENGTH_SHORT).show();
}
}
super.onActivityResult(requestCode, resultCode, data);
}
@Override
public void onBackPressed() {
Intent intent = new Intent(this, CameraActivity.class);
startActivity(intent);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu, menu);
return super.onCreateOptionsMenu(menu);
}
public void onShare(MenuItem item) {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
String shareLink = "Download this best OCR Text Scanner app and also gives accurate results Download it from the given link \n" +
"https://play.google.com/store/apps/details?id=" + getApplicationContext().getPackageName();
intent.putExtra(Intent.EXTRA_TEXT, shareLink);
startActivity(Intent.createChooser(intent, "Share using"));
}
public void onRate(MenuItem item) {
Uri uri = Uri.parse("https://play.google.com/store/apps/details?id=" + getApplicationContext().getPackageName());
Intent rateIntent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(rateIntent);
}
}
Any other query Comment Down...
sir Quotes App ka source code bhi de do
ReplyDeletePost a Comment