Если у вас нет времени читать или информация известна, окончательный код получения полноразмерного изображения из камеры Android-смартфона расположен в конце статьи. Если вы пишете кросс-платформенное приложение, то для получения изображения из камеры для ПК можно воспользоваться классом QCamera, пример для работы с которым описан в документации Qt. В соответствии с указанным примером мы добавляем в .pro файл  QT += multimedia multimediawidgets  Далее создаём виджет в своей программе, отображающий изображение из веб-камеры и сохраняющий его в QPixmap или QImage для дальнейшего использования. Когда возникает задача сделать то-же самое на Android, то выясняется, что multimediawidgets не поддерживаются данной ОС и камера снимать и сохранять снимки будет, но что она отображает в текущий момент будет загадкой, т. к. QCameraViewfinder использует multimediawidgets и на Android не отображает ничего. Дальнейший поиск решения проблемы приводит к двум вариантам решения: использовать QML и написать свой Qt Quick-элемент, выполняющий эту функцию, затем состыковать его остальной частью приложения на Qt Widgets, С++; использовать приложение по-умолчанию Android-смартфона для получения фотографии, затем обработать её в своём приложении. Если вы С++ программист Qt Widgets, то очередное эпизодическое углубление в QML займёт у вас время, добавим к этому время на написание Qt Quick-элемента, стыковки этого элемента с С++ кодом, отладки написанного кода. Если вы не профессионал в QML получается долго и сложно. В Android-смартфоне уже есть приложение по-умолчанию, прекрасно выполняющее нужную функцию, нужно им просто воспользоваться, применив Java-вызовы (JNI — Java Native Interface) из С++ кода при помощи QtAndroid. Выглядит проще. Полностью работающего кода в интернете я не нашёл, и, изучив опыт других, опираясь на документацию разработчка на Android написал собственный. Если у вас нет времени читать или информация известна, окончательный код получения полноразмерного изображения из камеры Android-смартфона расположен в конце статьи. Прочитав статью Получить фотографии на Android я сделал вывод, что применив данный метод можно получить или миниатюру изображения в виде массива пикселей или сохранить изображение в файл. Поискав готовые решения, я нашёл на GitHub подходящий код, который должен был выполнить нужную мне задачу. При его проверке, оказалось, что он устарел и теперь приводит к FileUriExposedException исключению, причины возникновения которого описаны в вышеуказанной ссылке на статью. Чтобы разобраться самостоятельно, как оно работает, начнём с простой задачи, не требующей обращения к файлам и множества Java-вызовов — получению миниатюры. Начнём с .pro файла.   Он должен содержать следующие строки для поддержки Android. Для получения результата нам понадобится класс, унаследованный от QAndroidActivityResultReceiver. Если требуется, чтобы объект нашего класса высылал изображение при помощи сигнала, то он также должен быть унаследован от любого класса Qt, имеющего базовый класс QObject.  Заголовочный файл (.h) класса имеет вид: Заголовочный файл (.cpp) класса имеет вид: если необходимо указать имя Java-класса (не в качестве аргумента Java-функции), то указывается полное имя класса (точки-разделители заменяются на "/"), например "android/content/Intent", "java/lang/String"; если аргумент функции Java-объект, то писать имя его класса начиная с "L" и ";" в конце, например "Landroid/content/Intent;", "Ljava/lang/String;"; если примитивный тип или массив, то указываются соответствующие сигнатуры (символы без разделителей), например "V" (void), "I" (jint) или "[IIIIIII" (массив jint, и 6 jint за ним); сигнатуры примитивных типов:     C/C++ JNI Java Signature uint8_t/unsigned char jboolean bool Z int8_t/char/signed char jbyte byte B uint16_t/unsigned short jchar char C int16_t/short jshort short S int32_t/int/(long) jint int I int64_t/(long)/long long jlong long J float jfloat float F double jdouble double D void                                     void V сигнатуры массивов:     JNI Java Signature jbooleanArray bool[] [Z jbyteArray byte[] [B jcharArray char[] [C jshortArray short[] [S jintArray int[] [I jlongArray long[] [L jfloatArray float[] [F jdoubleArray double[] [D jarray type[] [Lfully/qualified/type/name; jarray String[] [Ljava/lang/String; Чтобы получить доступ к элементам массива, необходимо использовать JNI-методы объекта класса QAndroidJniEnvironment, например такие как: NewIntArray, GetIntArrayElements, DeleteLocalRef GetArrayLength,GetObjectArrayElement, SetObjectArrayElement, и т.д. Подробнее можно прочитать в презентации (pdf) Practical Qt on Android JNI — qtcon. В заголовочном файле class CamShot содержит: значения     констант, взятых их документации     разработчка Android (так     код короче и меньше Java-вызовов); переопределение абстрактного метода void handleActivityResult(int  receiverRequestCode, int resultCode, const QAndroidJniObject &data) override; в  который будет передаваться Java-объект     класса     Intent     с     миниатюрой изображения; статический методstatic QImage camThumbnailToQImage(const QAndroidJniObject &data);извлекающий из Java-объекта класса Intent     Java-объект класса     Bitmap,     копирующий пиксели в массив пкселей     (32-битных значений) и построчно копирующий     эти пиксели в QImage; общедоступный слотvoid aMakeShot();вызывающий операцию по фотографированию     изображения и получению его миниатюры; сигналvoid createNew(const QImage &img);высылающий полученную миниатюру потребителю. В методе void aMakeShot() создаётся Java-объект Intent в который передаётся строка со значением, указывающим, что необходимо сделать — произвести захват изображения. После этого сформированное действие (Intent) отправляется на исполнение (Activity). В процессе выполнения действия будет запущено приложение по-умолчанию для фотографирования. Как только фотография будет сделана и подтверждена пользователем, будет произведён вызов виртуального метода handleActivityResult, в котором осуществляется проверка: является ли выполненное действие запрошенным и успешно выполненным. Если да, то вызовем статический метод camThumbnailToQImage получения изображения QImage из Java-объекта класса Bitmap и при успешном результате отправим полученное изображение потребителю сигналом Qt. Рассмотрим статический методstatic QImage camThumbnailToQImage(const QAndroidJniObject &data) override; Интересующее нас изображение передаётся в блоке дополнительных данных Java-объекта класса Intent и является Java-объектом класса Bundle, чтобы его получить нужно воспользоваться методом объекта Intent:Bundle getExtras()В Bundle хранятся ассоциативные пары <ключ-строка>:<значение>. В статье получить фотографии на Android указан ключ, по которому располагается миниатюра. Это строка "data". Получим Java-объект класса Bitmap по ключу, воспользовавшись методом объекта Intent:T getParcelableExtra (String name)Cобрать из Bitmap QImage сразу не получится, т. к. у Bitmap нет указателя на данные изображения вместе с заголовком его формата. Поэтому получим его размер (ширину и высоту) в пискселях и создадим QImage аналогичного размера для копирования значений пикселей в него. Для переноса значений пикселей из Bitmap в QImage воспользуемся методом объекта Bitmap:void getPixels (int[] pixels, int offset, int stride, int x, int y, int width, int height)Для этого понадобится создать линейный массив значений пикселейjintArray pixels = env->NewIntArray(aBitmapPixelsCount);После того, как пиксели будут скопированы, получим указатель на начало массива, который можно использовать в C++ коде:jint *pPixels = env->GetIntArrayElements(pixels, nullptr);Затем в цикле построчно скопируем значения пикселей из массива в изображение Qimage. По завершению копирования освобождаем память, выделенную под массив значений пикселейenv->DeleteLocalRef(pixels);и возвращаем результат в виде QImage.   Отлично. Миниатюра изображения получена. Для получения полноразмерного изображения необходимо воспользоваться классом FileProvider, чтобы получить разделяемый Uri для файла фотоснимка. Обращаю ваше внимание, что у Android, по крайней мере, их два: androidx.core.content.FileProvider; android.support.v4.content.FileProvider. Первый — самый современный, не поддерживается Qt, а для использования второго необходимо настроить среду QtCreator: Главное меню (сверху)→ «Инструменты» →    «Параметры» → «Устройства»→ вкладка «Android»→ вкладка «SDK Manager»→Развернуть элемент списка «Инструменты» в список→ «Extras»→ «Android Support Repository» - поставить флажок установить и нажить на кнопку «Применить» справа. Перейти на боковой панели QtCreator на вкладку «Проекты». В левой области окна «Сборка и запуск»→ «Сборка». Тогда в правой области окна «Build Android APK» → «Create Templates». В появившемся диалоговом окне установить флажок «Копировать файлы Gradle в каталог Android», нажать на кнопку «Завершить»: В каталоге с исходными кодами вашего приложения появится каталог «android», который необходимо добавить в проект. Если приложение кросс-платформенное и предполагается компиляция не только на Android, то в .pro файле необходимо добавить директиву android: перед каждым добавленным файлом: Отредактировать файл «AndroidManifest.xml» в android/AndroidManifest.xml, добавив в секцию  после текст: Это нужно для того, чтобы приложение фотографирования по-умолчанию могло передать нашему приложению файл. В каталоге сборки, там где находится автогенерируемый файл «AndroidManifest.xml» внутри каталога «res» рядом с каталогом «values», создать каталог «xml», а в нём файл «file_paths.xml» (… /abin/AndroidManifest.xml) (… /abin/res/xml/file_paths.xml). В созданный файл поместить следующие строки: где shared/ имя каталога в каталоге файлов нашего приложения Отредактировать файл android/build.gradle, добвив в секцию dependencies текст: секция целиком выглядит так: Данная инструкция сработает, если был установлен Android Support Repository. Настройка выполнена на основании статьи Sharing Files on Android or iOS from or with your Qt App - Part 4 и  подобных статей на эту тему. Заголовочный файл (.h) класса имеет вид: Заголовочный файл (.cpp) класса имеет вид: Так-же статические методы класса Aux для поворота изображения. Заголовочный файл (.h) класса Aux имеет вид: Файл исходного кода (.cpp) класса Aux имеет вид: Указанный метод позволяет получить за один раз или миниатюру или полноразмерное изображение. Результат зависит от переданного логического параметра «thumbnailNotFullScale». Если он равен логической единице, то будет получена миниатюра, если логическому нулю, то полноразмерное изображение. Попытка получить миниатюру при запросе сохранения полноразмерного изображения в файл приведёт к исключению в JNI-вызовах. Если миниатюра всегда ориентирована правильно, то полноразмерное изображение направлено в одну строну и его необходимо поворачивать. Информацию о необходимых преобразованиях можно получить из exif-свойств изображения при помощи ExifInterface. В обнаруженных в интернете Java-примерах преобразование к нормальной ориентации производится в Java-коде, в случае с Qt нет смысла мучить себя трудно отлаживаемыми, громоздкими JNI-вызовами и проще выполнить все необходимые преобразования в Qt. Программист-преподаватель Qt Widgets