react-native-image-picker 를 사용하려면 OS 별 설정을 해줘야 한다
ios/[project]/Info.plist
(...)
<key>NSPhotoLibraryUsageDescription</key>
<string>$(PRODUCT_NAME) would like access to your photo gallery</string>
<key>NSCameraUsageDescription</key>
<string>$(PRODUCT_NAME) would like to use your camera</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>$(PRODUCT_NAME) would like to save photos to your photo gallery</string>
</dict>
</plist>
android/app/src/main/AndoridManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.[프로젝트 명]">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
(...)
import {launchCamera, launchImageLibrary} from 'react-native-image-picker';
launchCamera(options, callback);
launchCamera 는 미지를 카메라로 촬영할 때 사용한다
options 는 생략 가능하고 callback 은 이미지 선택 후 호출되는 함수다
launchImageLibrary(options, callback);
launchImageLibrary() 는 갤러리에서 이미지를 선택할 때 사용
options 속성
callback 함수의 파라미터
iOS 는 설치 시 기본 사진이 들어있는데
Android 에는 갤러리가 비어있다
안드로이드 에뮬레이터로 브라우저에 접속해
이미지를 2초간 클릭하면 다운로드할 수 있다
const onSelectImage = () => {
launchImageLibrary(
{
mediaType: 'photo',
maxWidth: 512,
maxHeight: 512,
includeBase64: Platform.OS === 'android',
},
res => {
console.log(res);
},
);
};
갤러리에서 이미지를 선택하면 callback 이 실행된다
onSelectImage라는 함수를 만들어서, 이미지를 선택하고 선택한 이미지의 정보를
콘솔에 출력하도록 구현해줬습니다. launchImageLibrary를 사용할 때
안드로이드의 경우에만 includeBase64 값이 true가 되도록 설정해줬는데요.
추후 업로드할 때 uri에서 직접 파일을 읽는 과정에서 권한 오류가 발생할 수 있기 때문입니다.
따라서 안드로이드의 경우에는 이미지를 base64로 인코딩해두고,
업로드할 때 base64로 인코딩된 결괏값을 사용해 업로드를 진행합니다
(이 권한 이슈는 Google Photo를 사용하는 기기에서 발생합니다).
애플 실리콘이 탑재된 맥OS를 사용하는 경우 이미지를 선택했을 때
아무런 반응이 없을 수 있습니다. 그런 경우에는 우선 시뮬레이터를 종료하세요.
그리고 Xcode로 ios/[프로젝트 명]/PublicGalleryJohndoe.xcworkspace 파일을 열고,
Product > Clean Build Folder를 누르세요.
이어서 Xcode 상단의 프로젝트명 우측에 있는 영역을 눌러서 iPhone 12 또는
다른 원하는 디바이스를 선택하고 좌측의 재생 버튼을 눌러서 다시 시도해보세요.
추후 yarn ios를 다시 실행해야 하는 상황이 오면 재생 버튼을 다시 누르세요.
나는 m1 인데 왜 아무 일도 없을까..