我正在尝试为 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 版本中是必需的。所以我添加了空检查并解决了问题。
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"