Для коректної роботи камери та запису на телефон, потрібно отримати дозвіл від користувача. У камери є метод - Camera.requestCameraPermissionsAsync(), а у медіа-бібліотеці - MediaLibrary.requestPermissionsAsync().
Спочатку визначимо стейт в якому зберігатимемо значення чи має програма доступ до камери. Дефолтне значення null.
В залежності від значення цього стейту і рендеримо скрін. Скрін першого запуску:
Якщо користувач скасував доступ до камери і медіатеки.
Якщо доступ до камери і медіатеки надано, то рендеримо скрін. Його верстка буде розглянута далі.
У компонента Camera є проп - type. Він визначає тип камери: основна (back) або фронтальна (front).
Визначимо змінну, яка буде зберігати тип обраної камери:
Протестувати коректно камеру в симуляторах не вийде, тому використовуйте налагодження цього функціоналу на справжньому пристрої.
Якщо ми хочемо відображення камери на весь екран, то кладемо його в компонент View (container) і також розтягаємо на весь екран. А додатковий функціонал можна розмістити всередині компоненту Camera.
Якщо ми хочемо відображення камери розмістити не на весь екран, а обмежити в рамках компоненту View, то огортаємо камеру цим компонентом і стилями задаємо розміри.
Далі розглянемо варіант, що у нас на весь екран буде показуватися зображення з камери.
Визначимо всередині компонента Камери кнопку при натиску на яку буде змінюватися стейт type, який визначає, яка камера активна:
Щоб зробити знімок - потрібно отримати посилання на камеру, використовуючи ref, і вже у цього об'єкта викликати метод takePictureAsync(). Результатом його роботи буде об'єкт з ключем uri, де буде зберігатися посилання на фото.
Передаємо це посилання методу MediaLibrary.createAssetAsync(uri) і фото збережеться в пам'ять телефону.