2017-10-17 7 views
0

Je crée une caméra par SurfaceView, mais quand j'appuie sur home et retour à l'activité à nouveau. Le SurfaceView n'a plus rien montré. Il n'a pas invoqué surfaceCreated(SurfaceHolder holder)SurfaceView comment recréer s'il a été détruit

tandis que je reviens à l'activité. Que devrais-je faire?

ici est mon écriture de code par Kotlin `` ` classe 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 
} 

} 

Répondre

1

Je slove! Je change pour utiliser TextureView. Et il a quatre méthode de rappel. ici est l'un d'entre eux

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

il a été appelé alors que je revenir à l'activité !!! donc je peux ouvrir l'appareil photo quand je reviens