【发布时间】:2021-02-11 17:29:00
【问题描述】:
我是 android 新手,第一次实现 viewmodel。我的视图模型的目标是在设备方向变化中幸存下来。我使用 CameraX 作为它的相机应用程序。不幸的是,它无法在方向更改中幸存下来。这是我提供 ProcessCameraProvider 的视图模型。
ViewModelCamera.kt
class ViewModelCamera(application:Application) : AndroidViewModel(application){
private val getProcessCameraProvider by lazy {
MutableLiveData<ProcessCameraProvider>().apply {
val cameraProviderFuture=ProcessCameraProvider.getInstance(getApplication())
cameraProviderFuture.addListener(
{
try{
value=cameraProviderFuture.get()
}catch (exc :ExecutionException){
throw IllegalStateException("failed to retrieve camera process",exc)
}catch (exc:InterruptedException){
throw IllegalStateException("failed to retrieve camera process",exc)
}
},ContextCompat.getMainExecutor(getApplication())
)
}
}
val processCameraProvider:LiveData<ProcessCameraProvider>
get() = getProcessCameraProvider
}
这是在MainActivity.kt
中初始化和使用的 private lateinit var cameraProvider: ProcessCameraProvider
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setupViewModel()
bindingMainActivity = ActivityMainBinding.inflate(layoutInflater)
setContentView(bindingMainActivity.root)
sharedPrefs=sharedPref(applicationContext)
if (isPermissionGranted()){
try {
tryStartCamera()
bindingMainActivity.viewFinder.scaleType = if(!sharedPrefs.getPref("AspectRatio")) PreviewView.ScaleType.FILL_CENTER else PreviewView.ScaleType.FIT_CENTER
}catch (e: Exception) {
Toast.makeText(this, R.string.NotSupportMessage, Toast.LENGTH_SHORT).show()
finishAffinity()
}
} else {
requestPermission()
}
private fun setupViewModel(){
val vm=ViewModelProvider(this).get(ViewModelCamera::class.java)
vm.processCameraProvider.observe(
this, {
cameraProvider = it ?: return@observe
tryStartCamera()
}
)
}
private fun tryStartCamera() {
if(::cameraProvider.isInitialized && isPermissionGranted()){
startCamera(cameraProvider)
}
}
private fun startCamera(cameraProvider: ProcessCameraProvider) {
// Preview
preview = Preview.Builder()
.build()
imageCapture = ImageCapture.Builder()
.setFlashMode(flashMode)
.setTargetAspectRatio(ASPECTRATIO)
.setCaptureMode(LATENCY)
.build()
val cameraSelector = CameraSelector.Builder().requireLensFacing(lensFacing).build()
try {
// Unbind use cases before rebinding
cameraProvider.unbindAll()
// Bind use cases to camera
camera = cameraProvider.bindToLifecycle(
this, cameraSelector, preview, imageCapture
)
preview?.setSurfaceProvider(bindingMainActivity.viewFinder.surfaceProvider)
} catch (exc: Exception) {
Log.e("CameraX", "Use case binding failed", exc)
}
}
我有 2 个用于纵向和横向的布局 xml。 2布局是否会导致强制重启?
我知道我做错了,但我不知道是什么。我是否需要保存任何其他对象或整个实现是错误的。谢谢。
编辑
肖像的横向版本 - 是我不重启的期望
我在清单中覆盖配置时得到的视图
纵向的原始主视图
如何在不重新启动的情况下获取链接第一张图片。
【问题讨论】:
标签: android kotlin android-livedata android-viewmodel