Камера

Для роботи в телефоні з камерою використовують додатково такі пакети:

  • expo-camera - надає методи роботи з камерою

  • expo-media-library - надає методи для збереження фото в пам'ять телефону

Встановлюємо пакети:

terminal
npx expo install expo-camera
terminal
npx expo install expo-media-library

Підключаємо бібліотеки для роботи з камерою і медіатекою.

import { Camera } from "expo-camera";
import * as MediaLibrary from "expo-media-library";

Для коректної роботи камери та запису на телефон, потрібно отримати дозвіл від користувача. У камери є метод - Camera.requestCameraPermissionsAsync(), а у медіа-бібліотеці - MediaLibrary.requestPermissionsAsync().

Спочатку визначимо стейт в якому зберігатимемо значення чи має програма доступ до камери. Дефолтне значення null.

const [hasPermission, setHasPermission] = useState(null);

і при першому завантаженні скріна один раз запитуємо дозвіл до камери і медіатеки.

useEffect(() => {
  (async () => {
    const { status } = await Camera.requestPermissionsAsync();
    await MediaLibrary.requestPermissionsAsync();

    setHasPermission(status === "granted");
  })();
}, []);

В залежності від значення цього стейту і рендеримо скрін. Скрін першого запуску:

Якщо користувач скасував доступ до камери і медіатеки.

Якщо доступ до камери і медіатеки надано, то рендеримо скрін. Його верстка буде розглянута далі.

У компонента Camera є проп - type. Він визначає тип камери: основна (back) або фронтальна (front).

Визначимо змінну, яка буде зберігати тип обраної камери:

Протестувати коректно камеру в симуляторах не вийде, тому використовуйте налагодження цього функціоналу на справжньому пристрої.

Якщо ми хочемо відображення камери на весь екран, то кладемо його в компонент View (container) і також розтягаємо на весь екран. А додатковий функціонал можна розмістити всередині компоненту Camera.

Якщо ми хочемо відображення камери розмістити не на весь екран, а обмежити в рамках компоненту View, то огортаємо камеру цим компонентом і стилями задаємо розміри.

Далі розглянемо варіант, що у нас на весь екран буде показуватися зображення з камери.

Визначимо всередині компонента Камери кнопку при натиску на яку буде змінюватися стейт type, який визначає, яка камера активна:

Щоб зробити знімок - потрібно отримати посилання на камеру, використовуючи ref, і вже у цього об'єкта викликати метод takePictureAsync(). Результатом його роботи буде об'єкт з ключем uri, де буде зберігатися посилання на фото.

Передаємо це посилання методу MediaLibrary.createAssetAsync(uri) і фото збережеться в пам'ять телефону.

Резервний код

Документація:

Expo Camera

Expo MediaLibrary

Last updated