Attempt to invoke virtual method 'int android.view.Display.getRotation()

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

我正在尝试为 QR 代码扫描实施 Google MKit 库。我正在关注 本教程 它在我的手机上运行良好。发布到 Playstore 后,它在某些手机上崩溃了。

致命异常:java.lang.NullPointerException:尝试在空对象引用上调用虚方法“int android.view.Display.getRotation()”

我相信 binding.previewView!!.display.rotationcall 会抛出错误。它只发生在 Play 商店版本上。它不会在调试模式下发生。

 private var cameraProvider: ProcessCameraProvider? = null
private var cameraSelector: CameraSelector? = null
private var lensFacing = CameraSelector.LENS_FACING_BACK
private var previewUseCase: Preview? = null
private var analysisUseCase: ImageAnalysis? = null
private lateinit var binding: ActivityBarcodeScannerBinding

 override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
   // setContentView(R.layout.activity_barcode_scanner)
    binding = ActivityBarcodeScannerBinding.inflate(layoutInflater)
    setContentView(binding.root)

    setupCamera()
}

private fun setupCamera() {
    //previewView = binding.previewView
    cameraSelector = CameraSelector.Builder().requireLensFacing(lensFacing).build()
    ViewModelProvider(
        this, ViewModelProvider.AndroidViewModelFactory.getInstance(application)
    ).get(CameraXViewModel::class.java)
        .processCameraProvider
        .observe(this) { provider: ProcessCameraProvider? ->
            cameraProvider = provider
            if (isCameraPermissionGranted()) {
                bindCameraUseCases()
            } else {
                ActivityCompat.requestPermissions(
                    this,
                    arrayOf(Manifest.permission.CAMERA),
                    PERMISSION_CAMERA_REQUEST
                )
            }
        }
}

private fun bindCameraUseCases() {
    bindPreviewUseCase()
    bindAnalyseUseCase()
}

private fun bindPreviewUseCase() {
    if (cameraProvider == null) {
        return
    }
    if (previewUseCase != null) {
        cameraProvider!!.unbind(previewUseCase)
    }

    previewUseCase = Preview.Builder()
        .setTargetAspectRatio(screenAspectRatio)
        .setTargetRotation(binding.previewView!!.display.rotation)
        .build()
    previewUseCase!!.setSurfaceProvider(binding.previewView!!.surfaceProvider)

    try {
        cameraProvider!!.bindToLifecycle(
            /* lifecycleOwner= */this,
            cameraSelector!!,
            previewUseCase
        )
    } catch (illegalStateException: IllegalStateException) {
        Log.e(TAG, illegalStateException.message ?: "IllegalStateException")
    } catch (illegalArgumentException: IllegalArgumentException) {
        Log.e(TAG, illegalArgumentException.message ?: "IllegalArgumentException")
    }
}
android android-camerax scanning google-mlkit
1个回答
0
投票

我认为它在旧的 android 版本中是必需的。所以我添加了空检查并解决了问题。

   if(binding.previewView?.display?.rotation != null){
            previewUseCase = Preview.Builder()
                .setTargetAspectRatio(screenAspectRatio)
                .setTargetRotation(binding.previewView.display.rotation)
                .build()
        }else{
            previewUseCase = Preview.Builder()
                .setTargetAspectRatio(screenAspectRatio)
                .build()
        }

还要确保您使用的是相同版本的 android x camera

def camerax_version = "1.2.2"
    implementation "androidx.camera:camera-camera2:$camerax_version"
    implementation "androidx.camera:camera-lifecycle:$camerax_version"
© www.soinside.com 2019 - 2024. All rights reserved.