Как сделать индивидуальный макет камеры в Android?

Я пытаюсь разработать какое-то приложение для распознавания текста с функцией распознавания текста. Я написал и нашел несколько кодов, которые работают правильно, но моя проблема в том, что я хочу внести некоторые изменения в макет камеры. Я хочу добавить свою собственную кнопку захвата и добавить рамку. Я на самом деле сделал это в другом проекте с "видом на поверхность / держатель". Но я не могу реализовать свой проект, потому что он работает по-другому.

public class MainActivity extends AppCompatActivity {

private static final int REQUEST_GALLERY = 0;
private static final int REQUEST_CAMERA = 1;

private static final String TAG = MainActivity.class.getSimpleName();

private Uri imageUri;
private TextView detectedTextView;    // layouttaki text view

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    findViewById(R.id.choose_from_gallery).setOnClickListener(new View.OnClickListener() {   // galeriden resim seçme işlemi
        @Override
        public void onClick(View v) {
            Intent intent = new Intent();
            intent.setType("image/*");
            intent.setAction(Intent.ACTION_GET_CONTENT);
            startActivityForResult(intent, REQUEST_GALLERY);
        }
    });

    findViewById(R.id.take_a_photo).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {  // resim çekme işlemi

            String filename = System.currentTimeMillis() + ".jpg";

            ContentValues values = new ContentValues();
            values.put(MediaStore.Images.Media.TITLE, filename);
            values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
            imageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

            Intent intent = new Intent();
            intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
            startActivityForResult(intent, REQUEST_CAMERA);
        }
    });

    detectedTextView = (TextView) findViewById(R.id.detected_text);
    detectedTextView.setMovementMethod(new ScrollingMovementMethod());
}

private void inspectFromBitmap(Bitmap bitmap) {  //kendisine gelen bitmap resimden inspect yapar


    TextRecognizer textRecognizer = new TextRecognizer.Builder(this).build();
    try {
        if (!textRecognizer.isOperational()) {
            new AlertDialog.
                    Builder(this).
                    setMessage("Text recognizer could not be set up on your device").show();
            return;
        }

        Frame frame = new Frame.Builder().setBitmap(bitmap).build();
        SparseArray<TextBlock> origTextBlocks = textRecognizer.detect(frame);
        List<TextBlock> textBlocks = new ArrayList<>();


        for (int i = 0; i < origTextBlocks.size(); i++) {
            TextBlock textBlock = origTextBlocks.valueAt(i);
            textBlocks.add(textBlock);
        }
        Collections.sort(textBlocks, new Comparator<TextBlock>() {
            @Override
            public int compare(TextBlock o1, TextBlock o2) {
                int diffOfTops = o1.getBoundingBox().top - o2.getBoundingBox().top;
                int diffOfLefts = o1.getBoundingBox().left - o2.getBoundingBox().left;
                if (diffOfTops != 0) {
                    return diffOfTops;
                }
                return diffOfLefts;
            }
        });

        StringBuilder detectedText = new StringBuilder();
        for (TextBlock textBlock : textBlocks) {
            if (textBlock != null && textBlock.getValue() != null) {
                detectedText.append(textBlock.getValue());
                detectedText.append("\n");
            }
        }

        detectedTextView.setText(detectedText);     // detectedText is a final string
    }
    finally {
        textRecognizer.release();
    }
}



private void inspect(Uri uri) {
    InputStream is = null;
    Bitmap bitmap = null;
    try {
        is = getContentResolver().openInputStream(uri);
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inPreferredConfig = Bitmap.Config.ARGB_8888;
        options.inSampleSize = 2;
        options.inScreenDensity = DisplayMetrics.DENSITY_LOW;
        bitmap = BitmapFactory.decodeStream(is, null, options);

        Bitmap rotatedMap = RotateBitmap(bitmap,90);

        inspectFromBitmap(rotatedMap);
    } catch (FileNotFoundException e) {
        Log.w(TAG, "Failed to find the file: " + uri, e);
    } finally {
        if (bitmap != null) {
            bitmap.recycle();
        }
        if (is != null) {
            try {
                is.close();
            } catch (IOException e) {
                Log.w(TAG, "Failed to close InputStream", e);
            }
        }
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
        case REQUEST_GALLERY:
            if (resultCode == RESULT_OK) {
                inspect(data.getData());
            }
            break;
        case REQUEST_CAMERA:
            if (resultCode == RESULT_OK) {
                if (imageUri != null) {
                    inspect(imageUri);
                }
            }
            break;
        default:
            super.onActivityResult(requestCode, resultCode, data);
            break;
    }
}


public static Bitmap RotateBitmap(Bitmap source, float angle) // it rotates the bitmap for given parameter
{
    Matrix matrix = new Matrix();
    matrix.postRotate(angle);
    return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true);
}

В таком случае, что мне делать? Спасибо вам, ребята.

1 ответ

Нет, вы не можете изменить макет приложения камеры, которое соответствует цели ACTION_IMAGE_CAPTURE. На самом деле, разные устройства не будут иметь одинаковые приложения камеры. У каждого может быть очень различный внешний вид. Вам нужна "настраиваемая камера" для управления ее макетом и UX.

Другие вопросы по тегам