
カメラ権限の問題が起きたときの対処
上のようなエラーが出た場合は、次の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>Perfitt実行前にカメラ権限の許可ポップアップを表示
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) } }
(任意) 必要なときだけカメラ権限を要求する
アプリ起動時に権限を要求する代わりに、Perfittボタンをタップしたときだけ権限を要求したい場合は、次の作業を行ってください。
上記2番でMainActivityに設定したカメラ権限確認コードを、
WebAppInterfaceを作って移すWebViewと通信するためのJavaScriptインターフェースのコードを作成します(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 ) } } }WebViewにJavaScriptインターフェースを追加
WebViewにJavascriptInterfaceを追加し、WebAppInterfaceを生成するときにmainActivityを引数として渡してください。
MainActivity.ktwebView.addJavascriptInterface(WebAppInterface(this), "PerfittJsAndroidInterface")
iOSアプリのWebViewの場合
iOSはSafariでそのまま使う場合、特に作業はありません。アプリ内のWKWebViewにPerfittを入れる場合だけ、次の2点を確認してください。
Info.plistにNSCameraUsageDescriptionを追加し、iOS 15以降ではWKUIDelegateのメディアキャプチャ権限要求に許可で応答すると、WebView内でカメラが起動します。
側面撮影のとき、Perfittはスマートフォンの傾きで撮影角度を案内します。Safariでは計測中に「動作と方向へのアクセス」のポップアップで直接確認しますが、WebViewではPerfittが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")