Search code examples
androidkotlinandroid-webview

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
        }
    }
}

Solution

  • 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
    
    
        }
    }
    
    }