[React Native] react-native-vision-camera
๐ฅ 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์ผ ๋ ์นด๋ฉ๋ผ๋ฅผ ์ฌ์ฉํ ์ ์์.**ยฉ 2021. All rights reserved. LICENSE | NOTICE | CHANGELOG