public class MainActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {
private Button mButton, show_text;
private Button mCloudButton;
private Bitmap mSelectedImage;
ImageView imageView;
private GraphicOverlay mGraphicOverlay;
// Max width (portrait mode)
private Integer mImageMaxWidth;
// Max height (portrait mode)
private Integer mImageMaxHeight;
String s="";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = findViewById(R.id.image_view);
mButton = findViewById(R.id.button_text);
show_text = findViewById(R.id.show_text);
mCloudButton = findViewById(R.id.button_cloud_text);
mGraphicOverlay = findViewById(R.id.graphic_overlay);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
runTextRecognition();
}
});
mCloudButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
runCloudTextRecognition();
}
});
show_text.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showText(s);
}
});
Spinner dropdown = findViewById(R.id.spinner);
String[] items = new String[]{"Image 1", "Image 2", "Image 3"};
ArrayAdapter adapter = new ArrayAdapter<>(this, android.R.layout
.simple_spinner_dropdown_item, items);
dropdown.setAdapter(adapter);
dropdown.setOnItemSelectedListener(this);
}
private void runTextRecognition() {
s="";
FirebaseVisionImage image = FirebaseVisionImage.fromBitmap(mSelectedImage);
FirebaseVisionTextDetector detector = FirebaseVision.getInstance()
.getVisionTextDetector();
mButton.setEnabled(false);
detector.detectInImage(image)
.addOnSuccessListener(
new OnSuccessListener() {
@Override
public void onSuccess(FirebaseVisionText texts) {
mButton.setEnabled(true);
processTextRecognitionResult(texts);
}
})
.addOnFailureListener(
new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// Task failed with an exception
mButton.setEnabled(true);
e.printStackTrace();
}
});
}
private void processTextRecognitionResult(FirebaseVisionText texts) {
List blocks = texts.getBlocks();
if (blocks.size() == 0) {
Toast.makeText(getApplicationContext(), "No text found", Toast.LENGTH_LONG).show();
return;
}
mGraphicOverlay.clear();
s="";
for (int i = 0; i < blocks.size(); i++) {
List lines = blocks.get(i).getLines();
for (int j = 0; j < lines.size(); j++) {
List elements = lines.get(j).getElements();
for (int k = 0; k < elements.size(); k++) {
s +=elements.get(k).getText()+" ";
Graphic textGraphic = new TextGraphic(mGraphicOverlay, elements.get(k));
mGraphicOverlay.add(textGraphic);
}
}
}
}
private void runCloudTextRecognition() {
s="";
FirebaseVisionCloudDetectorOptions options =
new FirebaseVisionCloudDetectorOptions.Builder()
.setModelType(FirebaseVisionCloudDetectorOptions.LATEST_MODEL)
.setMaxResults(15)
.build();
mCloudButton.setEnabled(false);
FirebaseVisionImage image = FirebaseVisionImage.fromBitmap(mSelectedImage);
FirebaseVisionCloudDocumentTextDetector detector = FirebaseVision.getInstance()
.getVisionCloudDocumentTextDetector(options);
detector.detectInImage(image)
.addOnSuccessListener(
new OnSuccessListener() {
@Override
public void onSuccess(FirebaseVisionCloudText texts) {
mCloudButton.setEnabled(true);
s+=texts.getText();
processCloudTextRecognitionResult(texts);
}
})
.addOnFailureListener(
new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// Task failed with an exception
mCloudButton.setEnabled(true);
e.printStackTrace();
}
});
}
private void processCloudTextRecognitionResult(FirebaseVisionCloudText text) {
if (text == null) {
Toast.makeText(getApplicationContext(), "No text found", Toast.LENGTH_SHORT).show();
return;
}
mGraphicOverlay.clear();
List pages = text.getPages();
for (int i = 0; i < pages.size(); i++) {
FirebaseVisionCloudText.Page page = pages.get(i);
List blocks = page.getBlocks();
for (int j = 0; j < blocks.size(); j++) {
List paragraphs = blocks.get(j).getParagraphs();
for (int k = 0; k < paragraphs.size(); k++) {
FirebaseVisionCloudText.Paragraph paragraph = paragraphs.get(k);
List words = paragraph.getWords();
for (int l = 0; l < words.size(); l++) {
Graphic cloudTextGraphic = new CloudTextGraphic(mGraphicOverlay, words
.get(l));
mGraphicOverlay.add(cloudTextGraphic);
}
}
}
}
}
public void onItemSelected(AdapterView> parent, View v, int position, long id) {
mGraphicOverlay.clear();
switch (position) {
case 0:
mSelectedImage = ((BitmapDrawable)ResourcesCompat.getDrawable(this.getResources(), R.drawable.english_hindi_signboard1, null)).getBitmap();
break;
case 1:
mSelectedImage = ((BitmapDrawable)ResourcesCompat.getDrawable(this.getResources(), R.drawable.hindi_signboard1, null)).getBitmap();
break;
case 2:
mSelectedImage = ((BitmapDrawable)ResourcesCompat.getDrawable(this.getResources(), R.drawable.tamil_signboard1, null)).getBitmap();
break;
}
Pair targetedSize = getTargetedWidthHeight();
int targetWidth = targetedSize.first;
int maxHeight = targetedSize.second;
// Determine how much to scale down the image
float scaleFactor =
Math.max(
(float) mSelectedImage.getWidth() / (float) targetWidth,
(float) mSelectedImage.getHeight() / (float) maxHeight);
Bitmap resizedBitmap =
Bitmap.createScaledBitmap(
mSelectedImage,
(int) (mSelectedImage.getWidth() / scaleFactor),
(int) (mSelectedImage.getHeight() / scaleFactor),
true);
imageView.setImageBitmap(mSelectedImage);
mSelectedImage = resizedBitmap;
}
@Override
public void onNothingSelected(AdapterView> parent) {
}
private void showText(String text){
AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setMessage(text);
alert.setIcon(ContextCompat.getDrawable(this, R.mipmap.ic_launcher));
alert.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
}
});
alert.show();
}
private Integer getImageMaxWidth() {
if (mImageMaxWidth == null) {
// Calculate the max width in portrait mode. This is done lazily since we need to
// wait for
// a UI layout pass to get the right values. So delay it to first time image
// rendering time.
mImageMaxWidth = imageView.getWidth();
}
return mImageMaxWidth;
}
// Returns max image height, always for portrait mode. Caller needs to swap width / height for
// landscape mode.
private Integer getImageMaxHeight() {
if (mImageMaxHeight == null) {
// Calculate the max width in portrait mode. This is done lazily since we need to
// wait for
// a UI layout pass to get the right values. So delay it to first time image
// rendering time.
mImageMaxHeight =
imageView.getHeight();
}
return mImageMaxHeight;
}
// Gets the targeted width / height.
private Pair getTargetedWidthHeight() {
int targetWidth;
int targetHeight;
int maxWidthForPortraitMode = getImageMaxWidth();
int maxHeightForPortraitMode = getImageMaxHeight();
targetWidth = maxWidthForPortraitMode;
targetHeight = maxHeightForPortraitMode;
return new Pair<>(targetWidth, targetHeight);
}
}