为什么我无法在 android 中从 webview 打开相机? [英] Why I am not able to open camera from webview in android?

查看:69
本文介绍了为什么我无法在 android 中从 webview 打开相机?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我遇到的问题是我无法从 webview 打开相机,因为我有 php 页面,所以我必须从那里打开图库和相机,但我无法执行我从这个链接获得的内容https://gist.github.com/jhonsore/8a8378c147ec00ac6f3fa53569a"2.ef我可以打开图库但不能打开相机,请给我任何解决方案.

I am having problem that I am not able to open camera from webview in that I am having php page so I have to open gallery and camera from there but I am not able to do what I got from this link "https://gist.github.com/jhonsore/8a8378c147ec00ac6f3fa53569c82ef8". I can open gallery but not camera please give me any solution.

推荐答案

Kotlin for Android 7+ 中的一个工作示例

A working example in Kotlin for Android 7+

添加相机权限

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.CAMERA2" />

配置您的WebView

private fun configureWebViewSettings() {
    binding.webView.settings.javaScriptEnabled = true
    binding.webView.settings.domStorageEnabled = true
    binding.webView.settings.setSupportZoom(false)
    binding.webView.settings.allowFileAccess = true
    binding.webView.settings.allowContentAccess = true
    binding.webView.webChromeClient = getCustomWebChromeClient()
}

将以下几行添加到您的 Activity

Add the lines below to your Activity

private var imagePathCallback: ValueCallback<Array<Uri>>? = null
private var cameraImagePath: String? = null

实现一个 WebChromeClient 并将其添加到您的 WebView

Implement a WebChromeClient and add it to your WebView

    private fun getCustomWebChromeClient() = object : WebChromeClient() {
    
        override fun onShowFileChooser(
            view: WebView?,
            filePath: ValueCallback<Array<Uri>>?,
            fileChooserParams: FileChooserParams?
        ): Boolean {
            if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED)
                requestPermissions(arrayOf(Manifest.permission.CAMERA), CAMERA_REQUEST_CODE)
    
            imagePathCallback?.onReceiveValue(null)
            imagePathCallback = null
            imagePathCallback = filePath
    
            val takePictureIntent = createImageCaptureIntent()
    
            val contentSelectionIntent = Intent(Intent.ACTION_GET_CONTENT)
            contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE)
            contentSelectionIntent.type = INTENT_FILE_TYPE
    
            val intentArray: Array<Intent?>
            intentArray = takePictureIntent?.let { arrayOf(it) } ?: arrayOfNulls(0)
    
            val chooserIntent = Intent(Intent.ACTION_CHOOSER)
            chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent)
            chooserIntent.putExtra(Intent.EXTRA_TITLE, getString(R.string.file_chooser_title))
            chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray)
    
            try {
                startActivityForResult(chooserIntent, REQUEST_SELECT_FILE)
            } catch (e: ActivityNotFoundException) {
                imagePathCallback = null
                cameraImagePath = null
    
                Toast.makeText(
                    this@MainActivity,
                    getString(R.string.cannot_open_file_chooser_txt),
                    Toast.LENGTH_LONG
                ).show()
    
                return false
            }
    
            return true
        }

        private fun createImageCaptureIntent(): Intent? {
            var captureImageIntent: Intent? = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
    
            if (captureImageIntent?.resolveActivity(packageManager) != null) {
                var imageFile: File? = null
    
                try {
                    imageFile = createImageFile()
                    captureImageIntent.putExtra("CameraImagePath", cameraImagePath)
                } catch (ex: IOException) {
                    ex.printStackTrace()
                }
    
                if (imageFile != null) {
                    cameraImagePath = CAMERA_PHOTO_PATH_POSTFIX + imageFile.absolutePath
                    captureImageIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(imageFile))
                } else {
                    captureImageIntent = null
                }
            }
    
            return captureImageIntent
        }
    
        private fun createImageFile(): File? {
            val timeStamp = SimpleDateFormat.getDateInstance().format(Date())
            val imageFileName = PHOTO_NAME_POSTFIX + timeStamp + "_"
            val storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES)
    
            return File.createTempFile(imageFileName, PHOTO_FORMAT, storageDir)
        }

在您的 Activity

    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (requestCode == CAMERA_REQUEST_CODE) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(
                    this,
                    getString(R.string.amera_permission_granted_txt),
                    Toast.LENGTH_LONG
                ).show()
            } else {
                Toast.makeText(
                    this,
                    getString(R.string.camera_permission_denied_txt),
                    Toast.LENGTH_LONG
                ).show()
            }
        }
    }

在你的 Activity

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    if (requestCode != REQUEST_SELECT_FILE || imagePathCallback == null) return

    var results: Array<Uri>? = null

    if (resultCode == RESULT_OK) {
        if (data == null) {
            if (cameraImagePath != null) results = arrayOf(Uri.parse(cameraImagePath))
        } else {
            val dataString = data.dataString
            if (dataString != null) results = arrayOf(Uri.parse(dataString))
        }
    }

    imagePathCallback?.onReceiveValue(results)
    imagePathCallback = null
}

常量

companion object {
    private const val CAMERA_REQUEST_CODE = 113
    private const val REQUEST_SELECT_FILE = 13
    private const val INTENT_FILE_TYPE = "image/*"
    private const val CAMERA_PHOTO_PATH_POSTFIX = "file:"
    private const val PHOTO_NAME_POSTFIX = "JPEG_"
    private const val PHOTO_FORMAT = ".jpg"
}

试试看,应该可以.

这篇关于为什么我无法在 android 中从 webview 打开相机?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆