詳細ガイド›アプリWebViewのカメラ・センサー権限

アプリWebViewのカメラ・センサー権限

アプリ内のWebViewにPerfittを入れる場合、アプリがカメラ権限を渡す必要があります。権限がないと計測画面で下のようなエラーが出ます。Androidは以下の手順を、iOSは最後の節をご覧ください。

アプリWebViewのカメラ・センサー権限

カメラ権限の問題が起きたときの対処

上のようなエラーが出た場合は、次の3つの対応を行ってください。

  1. 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>
  2. Perfitt実行前にカメラ権限の許可ポップアップを表示

    MainActivity.ktに次のようにカメラ権限を許可するコードを設定してください

    MainActivity.kt
    val cameraPermissionCheck = ContextCompat.checkSelfPermission(
        this@MainActivity,
        android.Manifest.permission.CAMERA
    )
    
    if (cameraPermissionCheck != PackageManager.PERMISSION_GRANTED) {
        // 権限がない場合
        ActivityCompat.requestPermissions(
            this,
            arrayOf(android.Manifest.permission.CAMERA),
            1000
        )
    }
  3. WebViewの権限リクエストを渡す

    webChromeClientでonPermissionRequest関数をoverrideしてください。

    MainActivity.kt
    val webView: WebView = findViewById(R.id.test_webview)
    
    // 中略
    
    webView.webChromeClient = object : WebChromeClient() {
        override fun onPermissionRequest(request: PermissionRequest?) {
            request?.grant(request.resources)
        }
    }

(任意) 必要なときだけカメラ権限を要求する

アプリ起動時に権限を要求する代わりに、Perfittボタンをタップしたときだけ権限を要求したい場合は、次の作業を行ってください。

  1. 上記2番でMainActivityに設定したカメラ権限確認コードを、WebAppInterfaceを作って移す

    WebViewと通信するためのJavaScriptインターフェースのコードを作成します(MainActivity内のコードは削除してください)

    WebAppInterface.kt
    class 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
                )
            }
        }
    }
  2. WebViewにJavaScriptインターフェースを追加

    WebViewにJavascriptInterfaceを追加し、WebAppInterfaceを生成するときにmainActivityを引数として渡してください。

    MainActivity.kt
    webView.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)を呼び出してください。登録していない場合は、傾きの案内なしで撮影が進みます。

Swift
// 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")
このページは役に立ちましたか?