相关文章推荐
强健的单车  ·  JTable清空-CSDN博客·  3 月前    · 
长情的企鹅  ·  Java中File的delete() ...·  1 年前    · 
有情有义的卤蛋  ·  qt ...·  1 年前    · 
卖萌的眼镜  ·  ChangeServiceConfig2设置 ...·  1 年前    · 

无法访问'com.google.com.util.concurrent.ListenableFuture'类。检查你的模块classpath是否有缺失或冲突的依赖关系

0 人关注

我试图在我的flutter应用程序中整合 CameraX ,但我得到的错误是 Cannot access class 'com.google.common.util.concurrent.ListenableFuture'. Check your module classpath for missing or conflicting dependencies

There error comes from below line

val cameraProviderFuture = ProcessCameraProvider.getInstance(context)

以下是我的原生观点

class CealScanQrView(val context: Context, id: Int, creationParams: Map<String?, Any?>?) :
    PlatformView {
    private var mCameraProvider: ProcessCameraProvider? = null
    private var preview: PreviewView
    private var linearLayout: LinearLayout = LinearLayout(context)
    private lateinit var cameraExecutor: ExecutorService
    private lateinit var options: BarcodeScannerOptions
    private lateinit var scanner: BarcodeScanner
    private var analysisUseCase: ImageAnalysis = ImageAnalysis.Builder()
        .build()
    companion object {
        private val REQUIRED_PERMISSIONS = mutableListOf(Manifest.permission.CAMERA).toTypedArray()
    init {
        val linearLayoutParams = ViewGroup.LayoutParams(
            ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT
        linearLayout.layoutParams = linearLayoutParams
        linearLayout.orientation = LinearLayout.VERTICAL
        preview = PreviewView(context)
        preview.layoutParams = ViewGroup.LayoutParams(
            ViewGroup.LayoutParams.MATCH_PARENT,
            ViewGroup.LayoutParams.MATCH_PARENT
        linearLayout.addView(preview)
        setUpCamera()
    private fun setUpCamera(){
        if (allPermissionsGranted()) {
            startCamera()
        cameraExecutor = Executors.newSingleThreadExecutor()
        options = BarcodeScannerOptions.Builder()
            .setBarcodeFormats(
                Barcode.FORMAT_QR_CODE)
            .build()
        scanner = BarcodeScanning.getClient(options)
        analysisUseCase.setAnalyzer(
            // newSingleThreadExecutor() will let us perform analysis on a single worker thread
            Executors.newSingleThreadExecutor()
        ) { imageProxy ->
            processImageProxy(scanner, imageProxy)
    override fun getView(): View {
        return linearLayout
    override fun dispose() {
        cameraExecutor.shutdown()
    @SuppressLint("UnsafeOptInUsageError")
    private fun processImageProxy(
        barcodeScanner: BarcodeScanner,
        imageProxy: ImageProxy
        imageProxy.image?.let { image ->
            val inputImage =
                InputImage.fromMediaImage(
                    image,
                    imageProxy.imageInfo.rotationDegrees
            barcodeScanner.process(inputImage)
                .addOnSuccessListener { barcodeList ->
                    val barcode = barcodeList.getOrNull(0)
                    // `rawValue` is the decoded value of the barcode
                    barcode?.rawValue?.let { value ->
                        mCameraProvider?.unbindAll()
                .addOnFailureListener {
                    // This failure will happen if the barcode scanning model
                    // fails to download from Google Play Services
                .addOnCompleteListener {
                    // When the image is from CameraX analysis use case, must
                    // call image.close() on received images when finished
                    // using them. Otherwise, new images may not be received
                    // or the camera may stall.
                    imageProxy.image?.close()
                    imageProxy.close()
    private fun allPermissionsGranted() = REQUIRED_PERMISSIONS.all {
        ContextCompat.checkSelfPermission(context, it) == PackageManager.PERMISSION_GRANTED
    private fun startCamera() {
        val cameraProviderFuture = ProcessCameraProvider.getInstance(context)
        cameraProviderFuture.addListener({
            // Used to bind the lifecycle of cameras to the lifecycle owner
            val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()
            mCameraProvider = cameraProvider
            // Preview
            val surfacePreview = Preview.Builder()
                .build()
                .also {
                    it.setSurfaceProvider(preview.surfaceProvider)
            // Select back camera as a default
            val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
            try {
                // Unbind use cases before rebinding
                cameraProvider.unbindAll()
                // Bind use cases to camera
                cameraProvider.bindToLifecycle(
                    (context as FlutterActivity),
                    cameraSelector,
                    surfacePreview,
                    analysisUseCase,
            } catch (exc: Exception) {
                // Do nothing on exception
        }, ContextCompat.getMainExecutor(context))
class CealScanQrViewFactory : PlatformViewFactory(StandardMessageCodec.INSTANCE) {
    override fun create(context: Context, viewId: Int, args: Any?): PlatformView {
        val creationParams = args as Map<String?, Any?>?
        return CealScanQrView(context, viewId, creationParams)