[React Native] react-native-vision-camera
์นดํ
๊ณ ๋ฆฌ : Development
ํ๊ทธ: React-Native · reactnative · react-native-vision-camera · ๊ฐ๋ฐ ์ ํ · ๊ถํ ์ค์ · AOS · IOS · ๊ถํ ๊ฐ์ ธ์ค๊ธฐ · ๊ถํ ์์ฒญ ํ๊ธฐ · Camera ํ๊ทธ · useCameraDevices · deviceuseCameraDevices · photo · video · audio · video
ํ๊ทธ: React-Native · reactnative · react-native-vision-camera · ๊ฐ๋ฐ ์ ํ · ๊ถํ ์ค์ · AOS · IOS · ๊ถํ ๊ฐ์ ธ์ค๊ธฐ · ๊ถํ ์์ฒญ ํ๊ธฐ · Camera ํ๊ทธ · useCameraDevices · deviceuseCameraDevices · photo · video · audio · video
- ๐ฅ 1. ๊ฐ๋ฐ ์ ํ
- ๐ฅ 2. ๊ถํ ์ค์
- (1) : IOS
- (2) : AOS
- (3) : ๊ถํ ๊ฐ์ ธ์ค๊ธฐ / ๊ถํ ์์ฒญ ํ๊ธฐ
- ๐ฅ 3. ์์
๐ฅ 1. ๊ฐ๋ฐ ์ ํ
yarn add react-native-vision-camera
cd ios && pod install && cd ..
๐ฅ 2. ๊ถํ ์ค์
(1) : IOS
//Info.plist
<!-- ์นด๋ฉ๋ผ ๊ถํ -->
<key>NSCameraUsageDescription</key>
<string>$(PRODUCT_NAME) needs access to your Camera.</string>
<!-- ๋ง์ดํฌ ๊ถํ -->
<key>NSMicrophoneUsageDescription</key>
<string>$(PRODUCT_NAME) needs access to your Microphone.</string>
(2) : AOS
//AndroidManifest.xml
<!-- ์นด๋ฉ๋ผ ๊ถํ -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- ๋ง์ดํฌ ๊ถํ -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
(3) : ๊ถํ ๊ฐ์ ธ์ค๊ธฐ / ๊ถํ ์์ฒญ ํ๊ธฐ
(1) : ๊ถํ ๊ฐ์ ธ์ค๊ธฐ : ์ฌ์ฉ์๊ฐ ๊ถํ์ ๋ถ์ฌํ๋์ง ์ฒดํฌ
const cameraPermission = await Camera.getCameraPermissionStatus();
const microphonePermission = await Camera.getMicrophonePermissionStatus();
(2) : ๊ถํ ์์ฒญํ๊ธฐ : ์ฌ์ฉ์์๊ฒ ๊ถํ์ ์์ฒญ
const newCameraPermission = await Camera.requestCameraPermission();
const newMicrophonePermission = await Camera.requestMicrophonePermission();
๐ฅ 3. ์์
(1) : ๊ถํ ํ์ธ / ์์ฒญ
useEffect(() => {
const checkPermission = async () => {
// ์นด๋ฉ๋ผ ๊ถํ ํ์ธ
const cameraPermission = await Camera.getCameraPermissionStatus();
switch (cameraPermission) {
case "authorized":
// ์นด๋ฉ๋ผ ๊ถํ์ด ์์๋ ์คํํ ๋ก์ง
break;
case "not-determined":
// ์์ง ๊ถํ ์์ฒญ์ ํ์ง ์์ ์ํ๋ก ์๋กญ๊ฒ ๊ถํ ์์ฒญํ๊ธฐ
const newCameraPermission = await Camera.requestCameraPermission();
if (newCameraPermission === "authorized") {
// ์นด๋ฉ๋ผ ๊ถํ์ด ์์๋ ์คํํ ๋ก์ง
} else if (newCameraPermission === "denied") {
// ๊ถํ ์์ฒญ์ ํ์ง๋ง ๊ฑฐ๋ถ๋์๋ ์คํํ ๋ก์ง
// ex) ์ค์ ์ผ๋ก ์ด๋, ๊ถํ์ด ์์ผ๋ฉด ์นด๋ฉ๋ผ ์คํํ ์ ์๋ค๋ ์๋ฆผ์ฐฝ ๋ฑ๋ฑ
await Linking.openSettings();
}
break;
case "denied":
// ๊ถํ ์์ฒญ์ ํ์ง๋ง ๊ฑฐ๋ถ๋์๋ ์คํํ ๋ก์ง
// ex) ์ค์ ์ผ๋ก ์ด๋, ๊ถํ์ด ์์ผ๋ฉด ์นด๋ฉ๋ผ ์คํํ ์ ์๋ค๋ ์๋ฆผ์ฐฝ ๋ฑ๋ฑ
await Linking.openSettings();
break;
}
};
checkPermission();
}, []);
(2) : Camera ํ๊ทธ ๋ฐ props
function App() {
const devices = useCameraDevices();
const device = devices.back;
if (device == null) return <LoadingView />;
return (
<Camera
style={StyleSheet.absoluteFill}
device={device}
photo={true}
video={false}
audio={false} // ์ ํ์ฌํญ
isActive={true}
/>
);
}
**style
: ๋ด๊ฐ ์ํ๋ ์นด๋ฉ๋ผ์ ์คํ์ผ์ ์ง์ .StyleSheet.absoluteFill
์ ์ฌ์ฉํ์๋๋ ํ๋ฉด ์ ์ฒด๊ฐ ์นด๋ฉ๋ผ๋ก ๊ฝ ์ฐจ๊ฒ๋****useCameraDevices()
: ํ์ฌ ์ฌ์ฉํ๊ณ ์๋ ๊ธฐ๊ธฐ์ ์นด๋ฉ๋ผ ์ ๋ณด. ๊ฐ์ฒด๋ก ์ด๋ฃจ์ด์ ธ์์ผ๋ฉฐ ๋ณดํต ์, ๋ท๋ฉด(front, back) ์นด๋ฉ๋ผ์ ์ ๋ณด๊ฐ ๋ด๊ฒจ ์์.****deviceuseCameraDevices()
ย : ํ์ฌ ์ฌ์ฉํ๊ณ ์๋ ๊ธฐ๊ธฐ์ ์นด๋ฉ๋ผ๋ค์ ์ ๋ณด. ๊ฐ์ฒด๋ก ์ด๋ฃจ์ด์ ธ์์ผ๋ฉฐ ๋ณดํต ์, ๋ท๋ฉด(front, back) ์นด๋ฉ๋ผ์ ์ ๋ณด, back์์ back์๋ฆฌ๋ฅผ state๋ก ๊ด๋ฆฌํด, ์นด๋ฉ๋ผ ์ ํ๋ฒํผ์ ๋๋ ์๋ front์ back์ผ๋ก ๋ณ๊ฒฝ๋๋ ํ์์ผ๋ก ์ด๋ค ์นด๋ฉ๋ผ๋ฅผ ์ฌ์ฉํ ์ง ์ ํํ ์ ์์****photo
: ์ฌ์ง ์ดฌ์ํ ๋ true๋ก ์ค์ ๋์ด์ผ ์ดฌ์์ด ๊ฐ๋ฅ****video
,ยaudio
: ์์ ์ดฌ์๊ณผ ๋ง์ดํฌ๋ฅผ ์ฌ์ฉํ ๋ true๋ก ์ค์ ๋์ด์ผ ์ดฌ์์ด ๊ฐ๋ฅ****isActive
: true์ผ ๋ ์นด๋ฉ๋ผ๋ฅผ ์ฌ์ฉํ ์ ์์.**