Камера
Для роботи в телефоні з камерою використовують додатково такі пакети:
expo-camera - надає методи роботи з камерою
expo-media-library - надає методи для збереження фото в пам'ять телефону
Встановлюємо пакети:
npx expo install expo-cameranpx 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) і фото збережеться в пам'ять телефону.
Документація:
Last updated