Официальное руководство по началу работы по распознаванию текста с помощью MLKit довольно простое. По крайней мере, при обработке локальных изображений:

Мне было немного сложнее делать снимки на камеру и обрабатывать их, поэтому я собираюсь описать это.

Официальное руководство разработчика по фотографированию сначала выглядит простым, начните намерение и получите фотографию в onActivityResult(), но если вы просто быстро пролетаете над ним, как я, вы можете пропустить, что возвращенный Bitmap - это просто эскиз и совершенно неуместен для того, чтобы быть обработано с помощью MLKit.

Вам лучше всего кэшировать сделанную фотографию в полном разрешении во внутреннем хранилище. Для этого нам необходимо работать с FileProvider.

Добавление FileProvider в ваше приложение

Сначала добавьте FileProvider, который на самом деле является ContentProvider, в свой манифест в блоке <application></application>:

Затем создайте provider_paths.xml и определите, что нам требуются URI для нашего внутреннего хранилища (Context.filesDir):

После этого мы можем создать anIntent и указать на URI, где хотите, поэтому сохраните эту фотографию внутри:

Получить сделанное фото

Теперь нам нужно прочитать фотографию, когда с камеры вызывается onActivityResult(). К сожалению, мы не можем просто использовать BitmapFactory.decodeFile(outputFile), так как это приведет к ошибке. Скорее, мы должны получить Bitmap вот так:

val bitmap = MediaStore.Images.Media.getBitmap(contentResolver, imageUri)

С этим Bitmap мы могли снова позвонитьFirebaseVisionImage.fromBitmap(bitmap). Но это еще не все!

Обработать сделанное фото

Если вы сейчас просто передадите Bitmap в MLKit, он почти ничего не обнаружит. Это связано с тем, что фотографии, сделанные камерой, обычно поворачиваются, поэтому вы должны указать MLKit, что такое поворот.

Однако MLKit принимает параметр поворота только в том случае, если вы передадите ему media.Image через

val image = FirebaseVisionImage.fromMediaImage(mediaImage, rotation)

Я не понял, как на самом деле получить этот тип из камеры, поэтому я не мог использовать предложенный ими способ обнаружения вращения.

В итоге я просто повернул Bitmap на 90 °, потому что знал, что это поворот:

И это последний Bitmap, который вы можете передать MLKit для распознавания текста!