
카메라 권한 이슈 발생시 해결 방안
위와 같은 에러가 발생한 경우 다음 3가지 조치를 진행해주세요.
AndroidManifest.xml 에 카메라 권한 추가
app/src/main/AndroidManifest.xml 파일 manifest 사이에 아래와 같은 코드를 추가해주세요
AndroidManifest.xml<manifest> <!-- 중략 --> <uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" android:required="true" /> <!-- 중략 --> </manifest>펄핏 실행 전 카메라 권한 허락 팝업을 띄워주세요.
MainActivity.kt에 아래와 같이 카메라 권한을 허용하는 코드를 설정해주세요
MainActivity.ktval cameraPermissionCheck = ContextCompat.checkSelfPermission( this@MainActivity, android.Manifest.permission.CAMERA ) if (cameraPermissionCheck != PackageManager.PERMISSION_GRANTED) { // 권한이 없는 경우 ActivityCompat.requestPermissions( this, arrayOf(android.Manifest.permission.CAMERA), 1000 ) }WebView의 권한요청을 전달해주세요
webChromeClient에 onPermissionRequest 함수를 override 해주세요.
MainActivity.ktval webView: WebView = findViewById(R.id.test_webview) // 중략 webView.webChromeClient = object : WebChromeClient() { override fun onPermissionRequest(request: PermissionRequest?) { request?.grant(request.resources) } }
(선택) 필요시에만 카메라 권한 요청
앱 실행 시 권한을 요청하는 대신, 펄핏 버튼을 클릭했을 때만 권한을 요청하고 싶다면 아래 작업을 진행해주세요.
위 2번에서 MainActivity에 설정하였던 카메라 권한 확인 코드를
WebAppInterface를 만들어 옮겨주세요웹뷰와 통신할 수 있도록 하는 자바스크립트인터페이스 코드 작성 (MainActivity 안쪽 코드는 이제 삭제해주세요)
WebAppInterface.ktclass WebAppInterface(private val mainActivity: MainActivity) { @JavascriptInterface fun checkPermission() { val cameraPermissionCheck = ContextCompat.checkSelfPermission( mainActivity, android.Manifest.permission.CAMERA ) if (cameraPermissionCheck != PackageManager.PERMISSION_GRANTED) { // 권한이 없는 경우 ActivityCompat.requestPermissions( mainActivity, arrayOf(android.Manifest.permission.CAMERA), 1000 ) } } }웹뷰에 자바스크립트 인터페이스를 추가해주세요
웹뷰에 JavascriptInterface를 추가하고, WebAppInterface를 생성할 때 mainActivity를 인자로 넘겨주세요.
MainActivity.ktwebView.addJavascriptInterface(WebAppInterface(this), "PerfittJsAndroidInterface")
iOS 앱 웹뷰라면
iOS는 사파리에서 바로 쓰면 따로 할 일이 없습니다. 앱 안의 WKWebView에 펄핏을 넣을 때만 아래 두 가지를 확인하세요.
Info.plist에 NSCameraUsageDescription을 넣고, iOS 15 이상에서는 WKUIDelegate의 미디어 캡처 권한 요청에 허용으로 답해야 웹뷰 안에서 카메라가 켜집니다.
옆면 촬영 때 펄핏은 휴대폰 기울기로 촬영 각도를 안내합니다. 사파리는 측정 중 "동작 및 방향 접근 허용" 팝업으로 직접 묻지만, 웹뷰에서는 펄핏이 perfittMotionPermission 메시지 핸들러로 앱에 요청을 넘깁니다. 앱이 이 핸들러를 등록했다면 권한을 처리한 뒤 window.perfittMotionPermission(true 또는 false)를 호출해 주세요. 등록하지 않으면 기울기 안내 없이 촬영이 진행됩니다.
// WKScriptMessageHandler
func userContentController(_ controller: WKUserContentController,
didReceive message: WKScriptMessage) {
guard message.name == "perfittMotionPermission" else { return }
// 앱의 동작 센서 권한을 확인·요청한 뒤 결과를 돌려준다
let granted = true
webView.evaluateJavaScript("window.perfittMotionPermission(\(granted))")
}
// 등록
configuration.userContentController.add(self, name: "perfittMotionPermission")