在 WebView 中访问相机不起作用

问题描述 投票:0回答:1

我在 webView 中使用 onfido 链接来访问相机,我已授予权限,但相机无法工作,并给出日志为 “访问被拒绝查找属性'vendor.camera.aux.packagelist”,如果我尝试另一个链接(https://marcusbelcher.github.io/wasm-asm-camera-webgl-test/index.html)在同一个 webView 代码中可以工作,我可以访问相机。我尝试和调试了很多,但无法找到任何解决方案,如果有人可以提供帮助。这是我正在使用的Webview的代码

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))
        }
    }
}```
camera android-webview permission-denied android-image-capture
1个回答
0
投票

我缺少的部分是不使用

override fun onShowFileChooser( view: WebView,filePath: ValueCallback<Array<Uri>>, fileChooserParams: FileChooserParams )
在我的 Chrome 客户端内,实现此代码后,代码可以工作,但此日志问题仍然存在“访问被拒绝查找属性'vendor.camera.aux.packagelist”

© www.soinside.com 2019 - 2024. All rights reserved.