Android CameraX CameraView выдает ошибку CameraViewExBackground также с помощью runOnUiThread

#android #android-jetpack #android-camerax

#Android #android-реактивный ранец #android-камера

Вопрос:

Это зависимости, связанные с CameraX, в моем классе:

 implementation 'androidx.camera:camera-core:1.0.2'  implementation 'androidx.camera:camera-camera2:1.0.2'  implementation 'androidx.camera:camera-lifecycle:1.0.2'  implementation 'androidx.camera:camera-view:1.0.0-alpha31'  

Это кодекс моей деятельности. binding.camera это камера для просмотра:

 import android.Manifest import android.content.pm.PackageManager import android.os.Bundle import android.provider.MediaStore import androidx.appcompat.app.AppCompatActivity import androidx.camera.core.CameraX import androidx.core.app.ActivityCompat import com.dvisentin.fyne_android.databinding.ActivityCameraBinding import com.priyankvasa.android.cameraviewex.Modes import java.io.File  private lateinit var binding: ActivityCameraBinding  class CameraActivity : AppCompatActivity() {  val PERMISSION_CODE = 111   override fun onCreate(savedInstanceState: Bundle?) {  super.onCreate(savedInstanceState)  binding = ActivityCameraBinding.inflate(layoutInflater)  setContentView(binding.root)  }   override fun onResume() {  super.onResume()  checkCameraPermission()  }   override fun onPause() {  super.onPause()  if (ActivityCompat.checkSelfPermission(  this,  Manifest.permission.CAMERA  ) == PackageManager.PERMISSION_GRANTED  ) {  binding.camera.stop()  }  }   private fun checkCameraPermission() {  if (ActivityCompat.checkSelfPermission(  this,  Manifest.permission.CAMERA  ) != PackageManager.PERMISSION_GRANTED  ||  ActivityCompat.checkSelfPermission(  this,  Manifest.permission.WRITE_EXTERNAL_STORAGE  ) != PackageManager.PERMISSION_GRANTED  ) {  ActivityCompat.requestPermissions(  this,  arrayOf(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE),  PERMISSION_CODE  )  } else {  runOnUiThread {  binding.camera.start()   binding.camera.addPictureTakenListener {  val file = File(  MediaStore.Images.Media.EXTERNAL_CONTENT_URI.toString(),  "fyne_"   System.currentTimeMillis()   ".jpg"  )  file.writeBytes(it.data)  }   binding.ivCaptureButton.setOnClickListener {  binding.camera.capture()  }   binding.ivCameraSwitch.setOnClickListener {  binding.camera.facing =  if (binding.camera.facing == Modes.Facing.FACING_BACK) {  Modes.Facing.FACING_FRONT  } else {  Modes.Facing.FACING_BACK  }  }   binding.ivFlashSwitch.setOnClickListener {  binding.camera.flash =  if (binding.camera.flash == Modes.Flash.FLASH_OFF) {  Modes.Flash.FLASH_ON  } else {  Modes.Flash.FLASH_OFF  }  }  }  }  }   override fun onRequestPermissionsResult(  requestCode: Int,  permissions: Arraylt;out Stringgt;,  grantResults: IntArray  ) {  super.onRequestPermissionsResult(requestCode, permissions, grantResults)  if (requestCode == PERMISSION_CODE amp;amp; grantResults.any()) {  checkCameraPermission()  }  } }  

У меня возникает следующая ошибка, когда я пытаюсь, например, переключить камеру (нажав на переключатель IVC):

 FATAL EXCEPTION: CameraViewExBackground  Process: com.dvisentin.fyne_android, PID: 24573  java.lang.IllegalStateException: Method markState must be called on the main thread  at androidx.lifecycle.LifecycleRegistry.enforceMainThreadIfNeeded(LifecycleRegistry.java:317)  at androidx.lifecycle.LifecycleRegistry.markState(LifecycleRegistry.java:109)  at com.priyankvasa.android.cameraviewex.Camera2.startPreview(Camera2.kt:1131)  at com.priyankvasa.android.cameraviewex.Camera2.access$startPreview(Camera2.kt:70)  at com.priyankvasa.android.cameraviewex.Camera2$cameraDeviceCallback$2$1.onOpened(Camera2.kt:129)  at android.hardware.camera2.impl.CameraDeviceImpl$1.run(CameraDeviceImpl.java:143)  at android.os.Handler.handleCallback(Handler.java:873)  at android.os.Handler.dispatchMessage(Handler.java:99)  at android.os.Looper.loop(Looper.java:193)  at android.os.HandlerThread.run(HandlerThread.java:65)  

Изначально у меня была та же ошибка при запуске камеры (привязка.camera.start()). Затем я решил поместить это в runOnUiThread, но с другими операциями это, похоже, все равно не работает.