android - 在自定义相机中预览 kotlin
问题描述
设计定制相机。预览出现问题。我有 2 个课程:CameraActivity、CameraPreview。和这里一样。
抓拍照片后,照片保存,预览停止,没有任何反应,但再次点击后,没有照片,预览恢复工作。
如何解决?也许我没有正确使用预览类?
相机活动.kt
class CameraActivity(context: Context, frame : FrameLayout) {
private var mCamera: Camera? = null
private lateinit var mPreview: SurfaceView
init{
setCamerasId()
initCamera(mCameraIdBack)
}
private fun getCameraInstance(id : Int): Camera? {
return try {
Camera.open(id)
} catch (e: Exception) {null}
}
private fun initCamera(id : Int){
mCamera = getCameraInstance(id)
mPreview = CameraPreview(mContext, mCamera!!)
mFrame.addView(mPreview)
}
fun takePhoto() {
try {
mCamera?.takePicture(null, null, mPicture)
} catch (e : Exception){
Toast.makeText(mContext, "Error capture photo", Toast.LENGTH_SHORT).show()
}
try {
mCamera?.startPreview()
} catch (e : Exception){
Toast.makeText(mContext, "Error start preview", Toast.LENGTH_SHORT).show()
}
mPictureFile = null
}
private val mPicture = Camera.PictureCallback { data, _ ->
mPictureFile = getOutputMediaFile() ?: run {
return@PictureCallback
}
try {
Toast.makeText(mContext, "Success", Toast.LENGTH_SHORT).show()
val fos = FileOutputStream(mPictureFile)
fos.write(data)
fos.close()
addImageToGallery(mPictureFile!!.path, mContext)
callShutterSound()
} catch (e: Exception) {}
}
CameraPreview.kt
class CameraPreview(
private var mContext: Context,
private var mCamera: Camera
) : SurfaceView(mContext), SurfaceHolder.Callback {
private val mHolder: SurfaceHolder = holder.apply {
addCallback(this@CameraPreview)
setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS)
}
override fun surfaceCreated(holder: SurfaceHolder) {
mCamera.apply {
try {
setParameters()
setPreviewDisplay(holder)
startPreview()
} catch (e: Exception) {}
}
}
override fun surfaceDestroyed(holder: SurfaceHolder) {
mCamera.release()
}
override fun surfaceChanged(holder: SurfaceHolder, format: Int, w: Int, h: Int) {
if (mHolder.surface == null) {
return
}
try {
mCamera.stopPreview()
} catch (e: Exception) {}
mCamera.apply {
try {
setParameters()
setPreviewDisplay(mHolder)
startPreview()
} catch (e: Exception) {}
}
}
}
解决方案
需要延迟才能正确显示预览。
推荐阅读
- javascript - 有人可以用简单的英语解释我的对象代码的特定部分发生了什么吗?
- python - 使用 tkinter 单击更改按钮浮雕
- speech-to-text - Google Cloud Speech API 未返回所有文本
- javascript - 如何为数据表建模数据?
- java - Netty worker 和 boss 线程配置性能问题
- javascript - DynamoDB batchwriteItem 不会将数据放入 Lambda 函数中的动态 TableName
- python - 将 1 列拆分为 2 列 pandas 数据框 AttributeError .str
- ruby-on-rails - 运行 rails test 时无法理解 SQLException
- linux - sendmail - 具有相同的 from 和 to 主机名
- mysql - MySQL 数据库中的字符串值不正确