I am using an onfido link inside webView for accessing camera, I have granted the permissions but the camera is not working and giving logs as "Access denied finding property 'vendor.camera.aux.packagelist", if I try another link(https://marcusbelcher.github.io/wasm-asm-camera-webgl-test/index.html) in the same webView code works and I can access camera. I tried and debugged alot but unable to find any solution, if any one can help. This is the code of Webview I am using
class WebViewActivity : BaseActivity<ActivityWebViewBinding>() {
override fun bind() = ActivityWebViewBinding.inflate(layoutInflater)
private val TAG = "WebViewFragment"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding.webView.webViewClient = WebClient()
binding.webView.webChromeClient = ChromeClient(this)
checkAndRequest()
with(binding.webView.settings) {
javaScriptEnabled = true
javaScriptCanOpenWindowsAutomatically = true
mediaPlaybackRequiresUserGesture = false
domStorageEnabled = true
builtInZoomControls = true
allowUniversalAccessFromFileURLs=true
allowFileAccess = true
setSupportZoom(true)
allowContentAccess=true
displayZoomControls=false
}
binding.btnReviewMyInformations.setOnClickListener {
setResult(RESULT_FIRST_USER)
finish()
}
binding.webView.loadUrl(intent.getStringExtra(Constants.URL)!!)
}
inner class WebClient : WebViewClient() {
override fun onReceivedError(
view: WebView?,
request: WebResourceRequest?,
error: WebResourceError?
) {
Log.e("WebView", "Error: ${error?.description}")
super.onReceivedError(view, request, error)
}
override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
super.onPageStarted(view, url, favicon)
Log.d(TAG, "onPageStarted: $url")
}
override fun onPageFinished(view: WebView?, url: String?) {
super.onPageFinished(view, url)
Log.d(TAG, "onPageFinished: $url")
}
override fun onLoadResource(view: WebView?, url: String?) {
super.onLoadResource(view, url)
}
}
inner class ChromeClient(private val fragmentActivity: Activity) : WebChromeClient() {
override fun onPermissionRequest(request: PermissionRequest?) {
request?.let {
it.grant(request.resources)
Log.d("test420",request.resources.toString())
}
}
override fun onPermissionRequestCanceled(request: PermissionRequest?) {
Log.d("test420",request!!.resources.toString())
super.onPermissionRequestCanceled(request)
}
override fun onConsoleMessage(consoleMessage: ConsoleMessage?): Boolean {
Log.d("WebView", "${consoleMessage?.message()}")
return true
}
}
private fun checkAndRequest() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
if (ActivityCompat.checkSelfPermission(applicationContext, android.Manifest.permission.CAMERA
)
!= PackageManager.PERMISSION_GRANTED
||
ActivityCompat.checkSelfPermission(applicationContext,
android.Manifest.permission.READ_MEDIA_IMAGES
) != PackageManager.PERMISSION_GRANTED
||
ActivityCompat.checkSelfPermission(applicationContext,
android.Manifest.permission.READ_MEDIA_VIDEO
) != PackageManager.PERMISSION_GRANTED
) {
requestMultiplePermissions.launch(
arrayOf(
android.Manifest.permission.CAMERA,
android.Manifest.permission.READ_MEDIA_IMAGES,
android.Manifest.permission.READ_MEDIA_VIDEO
)
)
} else {
Log.d("TAG2", "Permission Already Granted")
}
} else {
if (ActivityCompat.checkSelfPermission(applicationContext, android.Manifest.permission.CAMERA
)
!= PackageManager.PERMISSION_GRANTED
||
ActivityCompat.checkSelfPermission(applicationContext, android.Manifest.permission.WRITE_EXTERNAL_STORAGE
)
!= PackageManager.PERMISSION_GRANTED
||
ActivityCompat.checkSelfPermission(applicationContext,
android.Manifest.permission.READ_EXTERNAL_STORAGE
) != PackageManager.PERMISSION_GRANTED
) {
requestMultiplePermissions.launch(
arrayOf(
android.Manifest.permission.CAMERA,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
android.Manifest.permission.READ_EXTERNAL_STORAGE
)
)
} else {
Log.d("TAG2", "Permission Already Granted")
}
}
}
private val requestMultiplePermissions =
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->
permissions.entries.forEach {
Log.d("TAG", "${it.key} = ${it.value}")
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
if (permissions[android.Manifest.permission.CAMERA] == true
&& permissions[android.Manifest.permission.READ_MEDIA_IMAGES] == true
&& permissions[android.Manifest.permission.READ_MEDIA_VIDEO] == true
) {
Log.d("requestMultiplePermissions", "Permission granted")
// isPermissionGranted=true
} else {
if (permissions[android.Manifest.permission.CAMERA] == false) {
if (ActivityCompat.shouldShowRequestPermissionRationale(
this,
android.Manifest.permission.CAMERA
)
) {
} else permissionsDenied()
} else if (permissions[android.Manifest.permission.READ_MEDIA_VIDEO] == false) {
if (!ActivityCompat.shouldShowRequestPermissionRationale(
this,
android.Manifest.permission.READ_MEDIA_VIDEO
)
) {
} else permissionsDenied()
} else if (permissions[android.Manifest.permission.READ_MEDIA_IMAGES] == false) {
if (!ActivityCompat.shouldShowRequestPermissionRationale(
this,
android.Manifest.permission.READ_MEDIA_IMAGES
)
) {
} else permissionsDenied()
}
Log.d("requestMultiplePermissions", "Permission not granted")
}
} else {
if (permissions[android.Manifest.permission.CAMERA] == true && permissions[android.Manifest.permission.WRITE_EXTERNAL_STORAGE] == true && permissions[android.Manifest.permission.READ_EXTERNAL_STORAGE] == true) {
Log.d("requestMultiplePermissions", "Permission granted")
// isPermissionGranted=true
} else {
if (permissions[android.Manifest.permission.CAMERA] == false) {
if (ActivityCompat.shouldShowRequestPermissionRationale(
this,
android.Manifest.permission.CAMERA
)
) {
} else {
permissionsDenied()
}
} else if (permissions[android.Manifest.permission.WRITE_EXTERNAL_STORAGE] == false
&& permissions[android.Manifest.permission.READ_EXTERNAL_STORAGE] == false
) {
if (!ActivityCompat.shouldShowRequestPermissionRationale(
this,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE
)
&& ActivityCompat.shouldShowRequestPermissionRationale(
this,
android.Manifest.permission.READ_EXTERNAL_STORAGE
)
) {
} else {
permissionsDenied()
}
}
Log.d("requestMultiplePermissions", "Permission not granted")
}
}
}
private var alertDialogRational: AlertDialog? = null
private fun permissionsDenied() {
val alertDialogBuilder = AlertDialog.Builder(this)
alertDialogRational?.getButton(AlertDialog.BUTTON_NEGATIVE)
?.setTextColor(ContextCompat.getColor(this, R.color.black))
alertDialogRational = alertDialogBuilder.setTitle("Permissions Required")
.setMessage(
"Please open settings, go to permissions and allow them."
)
.setPositiveButton(
"Settings"
) { _, _ ->
val intent = Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
Uri.fromParts(
"package",packageName,
null
)
)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
// activityResult.launch(intent)
}
.setNegativeButton(
"Cancel"
) { _, _ -> }
.setCancelable(false)
.create()
alertDialogRational!!.apply {
show()
getButton(AlertDialog.BUTTON_NEGATIVE)
.setTextColor(ContextCompat.getColor(this@WebViewActivity, R.color.black))
getButton(AlertDialog.BUTTON_POSITIVE)
.setTextColor(ContextCompat.getColor(this@WebViewActivity, R.color.black))
}
}
}```
The part which I was missing is that not using
override fun onShowFileChooser( view: WebView,filePath: ValueCallback<Array<Uri>>, fileChooserParams: FileChooserParams )inside my chrome client, after implementing this the code worked but this log issue is still there "Access denied finding property 'vendor.camera.aux.packagelist"