728x90
728x90

카메라 권한 요청 메시지 표시 방법 (Expo)

들어가며

  • 엑스포(Expo)를 이용하여 생성한 리액트 네이티브(React Native) 프로젝트에서 카메라 권한 요청 메시지를 표시하는 방법을 정리해본다.

 

방법

패키지 설치

  • 터미널에서 아래 명령을 실행하여 expo-camera 패키지를 설치해준다.
$ npx expo install expo-camera

 

앱 설정 파일 구성하기  (app.json)

  • 프로젝트의 최상단에 있는 앱 설정 파일(app.json)에 아래의 내용을 추가해준다.

 

/app.json
{
"expo": {
"plugins": [
[
"expo-camera",
{
"cameraPermission": "Allow $(PRODUCT_NAME) to access your camera",
"microphonePermission": "Allow $(PRODUCT_NAME) to access your microphone",
"recordAudioAndroid": true
}
]
]
}
}

 

옵션 설명
옵션 기본값 설명
cameraPermission "Allow $(PRODUCT_NAME) to access your camera" ▶iOS
- 카메라 사용 권한 허용 요청 메시지
microphonePermission "Allow $(PRODUCT_NAME) to access your microphone" ▶ iOS
- 마이크 사용 권한 허용 요청 메시지 설정
recordAudioAndroid true ▶ Android
- 안드로이드 기기에서 오디오 녹음 권한을 허용할 지의 여부
- true로 설정 시, 오디오 녹음을 위해 해당 권한을 요청하게 되며, false로 설정하면 오디오 권한을 사용하지 않는다.

 

$(PRODUCT_NAME)앱 이름으로 자동 치환된다.

 

사용하기

  • 크게 카메라 권한 요청 전 화면을 보여주는 코드와, 카메라 권한이 승인되지 않았을 때 화면을 보여주는 코드를 추가한다.
  • useCameraPermissions 훅을 이용하여 카메라 권한 승인 요청을 하는 함수(requestPermission)을 불러와서 사용한다.
    • 이 함수를 권한 승인 요청 컴포넌트의 onPress 속성의 값으로 넣어준다.
import { CameraView, CameraType, useCameraPermissions } from 'expo-camera';
import { useState } from 'react';
import { Button, StyleSheet, Text, TouchableOpacity, View } from 'react-native';
export default function App() {
const [permission, requestPermission] = useCameraPermissions();
// (1) 빈 화면 표시 (카메라 권한 요청 전 화면, 보통 로딩 스피너를 넣어준다.)
if (!permission) {
// Camera permissions are still loading.
return <View />;
}
// (2) 카메라 사용 권한이 승인되지 않았을 경우의 화면 표시
if (!permission.granted) {
return (
<View >
<Text>We need your permission to show the camera</Text>
<Button onPress={requestPermission} title="grant permission" />
</View>
);
}
// ...
}

 

사용 예시 코드

import { CameraView, CameraType, useCameraPermissions } from 'expo-camera';
import { useState } from 'react';
import { Button, StyleSheet, Text, TouchableOpacity, View } from 'react-native';
export default function App() {
const [facing, setFacing] = useState<CameraType>('back');
const [permission, requestPermission] = useCameraPermissions();
if (!permission) {
// Camera permissions are still loading.
return <View />;
}
if (!permission.granted) {
// Camera permissions are not granted yet.
return (
<View style={styles.container}>
<Text style={styles.message}>We need your permission to show the camera</Text>
<Button onPress={requestPermission} title="grant permission" />
</View>
);
}
function toggleCameraFacing() {
setFacing(current => (current === 'back' ? 'front' : 'back'));
}
return (
<View style={styles.container}>
<CameraView style={styles.camera} facing={facing}>
<View style={styles.buttonContainer}>
<TouchableOpacity style={styles.button} onPress={toggleCameraFacing}>
<Text style={styles.text}>Flip Camera</Text>
</TouchableOpacity>
</View>
</CameraView>
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
},
message: {
textAlign: 'center',
paddingBottom: 10,
},
camera: {
flex: 1,
},
buttonContainer: {
flex: 1,
flexDirection: 'row',
backgroundColor: 'transparent',
margin: 64,
},
button: {
flex: 1,
alignSelf: 'flex-end',
alignItems: 'center',
},
text: {
fontSize: 24,
fontWeight: 'bold',
color: 'white',
},
});

 

참고 사이트

 

Camera

A React component that renders a preview for the device's front or back camera.

docs.expo.dev

 

728x90
728x90

카메라 권한 요청 메시지 표시 방법 (Expo)들어가며방법패키지 설치앱 설정 파일 구성하기  (app.json)사용하기사용 예시 코드참고 사이트