2017-10-17 153 views
0

我通过SurfaceView创建一个相机,但是当我按Home并且再次返回到活动时。 SurfaceView不再显示任何东西。它没有调用 surfaceCreated(SurfaceHolder holder)SurfaceView如何重新创建,如果它已被破坏

当我回到活动。我该怎么办?

这里是科特林 ``` 类MyCameraView我的代码写:SurfaceView,SurfaceHolder.Callback,Camera.PreviewCallback,Camera.FaceDetectionListener {

private lateinit var mCamera : Camera 
var sizes : List<Camera.Size>? = null 

constructor(ctx : Context, attrs : AttributeSet?) : super(ctx,attrs){ 
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    holder.addCallback(this) 
} 

constructor(ctx : Context):this(ctx,null){ 
} 

override fun surfaceChanged(p0: SurfaceHolder?, format: Int, width: Int, height: Int) { 
    Log.e("MyCameraView","CHANGE ") 
    val sizes = mCamera.parameters.supportedPreviewSizes 

    val size = getOptimalSzie(sizes) 

    val supportWith = size.height 
    val supportHeight : Int = size.width 
    val radio : Float = width.toFloat()/supportWith 
    setMeasuredDimension(width,(supportHeight*radio).toInt()) 
    layout(0, (-(supportHeight*radio)/5).toInt(),width, ((supportHeight*radio).toInt()-(supportHeight*radio)/5).toInt()) 


} 

override fun surfaceDestroyed(p0: SurfaceHolder?) { 
    Log.e("MyCameraView","DESTORY") 
    holder.removeCallback(this) 
    mCamera.setPreviewCallback(null) 
    mCamera.stopFaceDetection() 
    mCamera.stopPreview() 
    mCamera.lock() 
    mCamera.release() 
} 

override fun surfaceCreated(p0: SurfaceHolder?) { 

    Log.e("MyCameraView","OPEN") 

    mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT) 
    mCamera.setDisplayOrientation(90) 
    mCamera.setPreviewCallback(this) 

    mCamera.setPreviewDisplay(holder) 

    mCamera.setFaceDetectionListener(this) 

    mCamera.startPreview(); 

    mCamera.startFaceDetection() 

} 

private fun getOptimalSzie(sizes: List<Camera.Size>): Camera.Size { 
    var pos = 0 
    var ratio = 0 
    var viewRatio = height/width 
    sizes.forEachIndexed { index, size -> 
     val curRatio = size.width/size.height 
     if(ratio == 0) ratio = curRatio 
     else if((viewRatio - curRatio) < (viewRatio - ratio) ){ 
      ratio = curRatio 
      pos = index 
     } 
    } 
    return sizes[pos] 
} 

override fun onPreviewFrame(data: ByteArray?, camera: Camera) { 
    if(allowTake) { 

     val parameters = camera.getParameters() 
     val width = parameters.previewSize.width 
     val height = parameters.previewSize.height 

     val yuv = YuvImage(data, parameters.previewFormat, width, height, null) 

     val out = ByteArrayOutputStream() 
     yuv.compressToJpeg(Rect(0, 0, width, height), 50, out) 
     val bytes = out.toByteArray() 
     val b = BitmapFactory.decodeByteArray(bytes, 0, bytes.size) 
     detected?.invoke(bytes) 
     allowTake = false 
     hasTake = true 

    } 


} 
var hasTake = false 
private var allowTake = false 
override fun onFaceDetection(faces: Array<out Camera.Face>?, camera: Camera?) { 
    if(!hasTake) { 
     allowTake = true 
    } 
} 



private var detected: ((bitmap : ByteArray) -> Unit)? = null 

fun onFaceDetected(detected : (bitmap : ByteArray)->Unit){ 
    this.detected = detected 
} 

} 

回答

1

我解决售后服务吧!我更改为使用TextureView。它有四种回调方法。这里是其中的一个

onSurfaceTextureAvailable(surface: SurfaceTexture?, width: Int, height: Int)

它被称为当我回到活动! 所以我可以打开相机,当我回来

相关问题