Daniel
Daniel

Reputation: 145

How to access the camera from inside a Webview?

We connect to https. If i a chrome browser on Android device, we're able to connect with both Camera and Mic enabled. Able to turn them on and off as well. But if we attempt the same using a webview, we're not even getting a prompt the website to authorize access and obtain a "Failed to access camera/mic" mistake when trying to turn them on.

Manifest

 <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.webkit.PermissionRequest" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

WebView Activity

class WebView : AppCompatActivity() {

    val permission = arrayOf(Manifest.permission.CAMERA,
        Manifest.permission.RECORD_AUDIO,
        Manifest.permission.MODIFY_AUDIO_SETTINGS)
    val requestCode = 1
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_web_view)

        WebViewSetup()


        if (!isPermissionGranted()) {
            askPermissions()


        }


    }


    private fun askPermissions() {
        ActivityCompat.requestPermissions(this, permission, requestCode)
    }

    private fun isPermissionGranted(): Boolean {
        permission.forEach {
            if (ActivityCompat.checkSelfPermission(this, it) != PackageManager.PERMISSION_GRANTED)
                return false
        }

        return true
    }


    @SuppressLint("SetJavaScriptEnabled")
    private fun WebViewSetup() {


        val url = intent.extras!!.getString("url")
        webview.webChromeClient = WebChromeClient()
        webview.apply {
            if (url != null) {
                loadUrl(url)
            }

            Log.d("callBtn", "Url ::  $url!!!! ")
            settings.javaScriptEnabled = true
            settings.javaScriptCanOpenWindowsAutomatically = true
            settings.domStorageEnabled = true
            settings.javaScriptCanOpenWindowsAutomatically = true
            settings.allowContentAccess = true
            settings.safeBrowsingEnabled = true
            settings.mediaPlaybackRequiresUserGesture = false
        }
    }
}

Upvotes: 3

Views: 7772

Answers (1)

Daniel
Daniel

Reputation: 145

This is answer

class WebViewActivity : AppCompatActivity() {

private val permission = arrayOf(Manifest.permission.CAMERA,
    Manifest.permission.RECORD_AUDIO,
    Manifest.permission.MODIFY_AUDIO_SETTINGS)
private val requestCode = 1

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_web_view)
    val action: String? = intent?.action
    val data: Uri? = intent?.data

    WebViewSetup()
    if (!isPermissionGranted()) {

        askPermissions()

    }

    webview.webChromeClient = object : WebChromeClient() {
        @TargetApi(Build.VERSION_CODES.LOLLIPOP)
        override fun onPermissionRequest(request: PermissionRequest) {
            request.grant(request.resources)
        }
    }

}


private fun askPermissions() {
    ActivityCompat.requestPermissions(this, permission, requestCode)
}

private fun isPermissionGranted(): Boolean {
    permission.forEach {
        if (ActivityCompat.checkSelfPermission(this, it) != PackageManager.PERMISSION_GRANTED)
            return false
    }

    return true
}

@SuppressLint("SetJavaScriptEnabled")
private fun WebViewSetup() {

    val url = intent.extras!!.getString("url")
    webview.webChromeClient = WebChromeClient()


    webview.apply {
        if (url != null) {
            loadUrl(url)
        }

        Log.d("callBtn", "Url ::  $url!!!! ")
        settings.javaScriptEnabled = true
        settings.javaScriptCanOpenWindowsAutomatically = true
        settings.domStorageEnabled = true
        settings.allowContentAccess = true
        settings.safeBrowsingEnabled = true
        settings.mediaPlaybackRequiresUserGesture = false


    }
}

}

Upvotes: 11

Related Questions