privatefunstartCamera() { val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener(Runnable { // Used to bind the lifecycle of cameras to the lifecycle owner val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()
// Preview preview = Preview.Builder() .build()
// Select back camera val cameraSelector = CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build()
try { // Unbind use cases before rebinding cameraProvider.unbindAll()
// Bind use cases to camera camera = cameraProvider.bindToLifecycle( this, cameraSelector, preview) preview?.setSurfaceProvider(viewFinder.createSurfaceProvider()) } catch (exc: Exception) { Log.e(TAG, "Use case binding failed", exc) }
privatefuntakePhoto() { // Get a stable reference of the modifiable image capture use case val imageCapture = imageCapture ?: return
// Create timestamped output file to hold the image val photoFile = File( outputDirectory, SimpleDateFormat(FILENAME_FORMAT, Locale.CHINA ).format(System.currentTimeMillis()) + ".jpg")
// Create output options object which contains file + metadata val outputOptions = ImageCapture.OutputFileOptions.Builder(photoFile).build()
// Setup image capture listener which is triggered after photo has // been taken imageCapture.takePicture( outputOptions, ContextCompat.getMainExecutor(this), object : ImageCapture.OnImageSavedCallback { overridefunonError(exc: ImageCaptureException) { Log.e(TAG, "Photo capture failed: ${exc.message}", exc) }
privatefun ByteBuffer.toByteArray(): ByteArray { rewind() // Rewind the buffer to zero valdata = ByteArray(remaining()) get(data) // Copy the buffer into a byte array returndata// Return the byte array }
overridefunanalyze(image: ImageProxy) { //处理图片数据 val buffer = image.planes[0].buffer valdata = buffer.toByteArray() val pixels = data.map { it.toInt() and 0xFF } val luma = pixels.average() listener(luma) image.close() } }