如何在 android 网络视图中拍摄照片或 select 图库文件

How to take photo or select gallery files in android webview

我在 angular 中有一个组件具有拍照或 select 文件的功能

文件上传正常,问题是它不让我拍照,我已经尝试过各种方式修改代码但它不起作用。

我如何进行调整以使两个选项都起作用,我如何确定哪个选项被 selected(拍照,select 文件)?

Angular代码

Html

<input
    #inputFile
    accept="image/*,application/pdf"
    type="file"
    (change)="loadFile($event)"
    style="display: none;"
    onclick="this.value = null"
/>
<input
    #cameraFile
    accept="image/*"
    capture="camera"
    type="file"
    (change)="loadFile($event)"
    style="display: none;"
    onclick="this.value = null"
/>

Ts

selectOption(opcion: any) {
    if (opcion.tipoArchivo === this.documentType.documento.idDocumento) {
        switch (opcion.opcion) {
            case MenuBottomSheet.ELEGIR_FOTO:
                this.fileChooser.nativeElement.click();
                break;
            case MenuBottomSheet.TOMAR_FOTO:
                this.cameraFile.nativeElement.click();
                break;
        }
    }
}

科迪戈 android

web_view?.webChromeClient = object: WebChromeClient() {
    override fun onShowFileChooser(webView: WebView?, filePathCallback: ValueCallback<Array<Uri>>?,
        fileChooserParams: FileChooserParams): Boolean {
        Log.d("onShowFileChooser ======> ", "")
        super.onShowFileChooser(webView, filePathCallback, fileChooserParams)
        if (uploadMessage != null) {
            uploadMessage?.onReceiveValue(null)
            uploadMessage = null
        }
        uploadMessage = filePathCallback
        val intent: Intent = fileChooserParams.createIntent()
        try {
            startActivityForResult(intent, REQUEST_SELECT_FILE)
        } catch (e: ActivityNotFoundException) {
            uploadMessage = null
            return false
        }
        return true
    }
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (resultCode == RESULT_OK && (requestCode == REQUEST_SELECT_FILE || requestCode == REQUEST_IMAGE_CAPTURE)) {
        if (uploadMessage == null) {
            return
        }
        uploadMessage?.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, data))
        uploadMessage = null
    }
}

我把对我有用的代码放在这里

override fun onShowFileChooser(webView: WebView?, filePathCallback: ValueCallback<Array<Uri>>?, fileChooserParams: FileChooserParams): Boolean {
    super.onShowFileChooser(webView, filePathCallback, fileChooserParams)
    if (uploadMessage != null) {
        uploadMessage?.onReceiveValue(null)
        uploadMessage = null
    }
    uploadMessage = filePathCallback
    if (fileChooserParams.isCaptureEnabled()) {
        takingPhoto = true
        var permissions = ArrayList<String>()
        if(!existCameraPermission()) {
            permissions.add(Manifest.permission.CAMERA);
        }
        if(!existMemoryWritePermission()) {
            permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
        }
        if(!permissions.isEmpty()) {
            requestPermissions(permissions.toTypedArray(), 1);
        } else {
            takePhoto()
        }
    } else {
        takingPhoto = false
        val intent: Intent = fileChooserParams.createIntent()
        try {
            startActivityForResult(intent, REQUEST_SELECT_FILE)
        } catch (e: ActivityNotFoundException) {
            uploadMessage = null
            return false
        }
    }
    return true
}



fun takePhoto() {
    var takePictureIntent: Intent? = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
    if (takePictureIntent?.resolveActivity(packageManager) != null) {
        var photoFile: File? = null
        try {
            photoFile = createImageFile()
        } catch (ex: IOException) {
            Log.d("ocurrio un error ================> ", ex.toString())
        }
        if (photoFile != null) {
            photoFileTmp = photoFile
            val uri = FileProvider.getUriForFile(activity, fileProvider, photoFile);
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri)
        }
        startActivityForResult(takePictureIntent, REQUEST_SELECT_FILE)
    }
}