2017-10-17 16 views
0

SurfaceView로 카메라를 만들지 만 집에 돌아 왔을 때 다시 활동으로 돌아갑니다. SurfaceView는 더 이상 아무것도 보여주지 않았습니다. 그것은 호출하지 않았다 surfaceCreated(SurfaceHolder holder)SurfaceView 파괴 된 경우 재 작성하는 방법

내가 다시 활동으로. 어떻게해야합니까? 서피스 뷰 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

나는 그것을 풀기가 :

여기에 코 틀린 ``` 클래스 MyCameraView에 의해 내 코드 쓰기입니다! TextureView를 사용하도록 변경합니다. 그리고 그것은 네 가지 콜백 메소드를 가지고 있습니다. 여기가 동안 다시 활동 불렀다

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

그들 중 하나입니다! 다시 돌아올 때 카메라를 열 수 있습니다.