#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, но с другими операциями это, похоже, все равно не работает.