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