EGL错误:0x3003,摄像头设备遇到严重错误(Camera2 Api)

时间:2018-07-27 21:14:50

标签: android android-camera2

我正在编写一个应用控制闪光灯移动设备,我可以控制闪光灯的开或关。但是它只能运行几次,然后崩溃。

我不明白它崩溃的原因。我很累。

这是我的代码:

class FlashActivity : AppCompatActivity() {

private val PERMISSIONS_REQUEST_CAMERA = 1

private var sX = 0f
private var sY = 0f
private lateinit  var button: Button
private lateinit var camManager: CameraManager
private lateinit var camDevice: CameraDevice
private lateinit var request: CaptureRequest.Builder
private lateinit var camSession: CameraCaptureSession

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_flash)
    getScreen()
    setUI()
    init()
}

private fun openCamera(){
    if(ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED){
        ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CAMERA), PERMISSIONS_REQUEST_CAMERA)
    }else{
        if(getListCamera().lastIndex > 0)
            camManager.openCamera(getListCamera()[0], OpenCallback(), null)
        else
            Toast.makeText(this, "this device is not support", Toast.LENGTH_SHORT).show()
    }
}

private fun init(){
    camManager = this.getSystemService(android.content.Context.CAMERA_SERVICE) as CameraManager
    openCamera()
}

private fun getListCamera(): List<String> {
    var list = listOf<String>()
    for (i in camManager.cameraIdList){
        list += i
    }
    return list
}

private fun event(){
    var i = 0
    button.setOnClickListener{
        if(i%2 == 0) {
            button.text = "On"
            request.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_TORCH)
        }
        else{
            button.text = "Off"
            request.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF)
        }
        camSession.setRepeatingRequest(request.build(), null, null)
        i++
    }
}

private fun setUI(){
    button = Button(this)
    button.isActivated = false
    button.text = "Off"
    button.measure(0, 0)
    rl_flash_activity.addView(button)
    button.x = sX*50 - button.measuredWidth/2
    button.y = sY*50

}

private fun getScreen(){
    val manager = windowManager.defaultDisplay
    val point  = Point()
    manager.getSize(point)
    sX = point.x/100f
    sY = point.y/100f
}

inner class OpenCallback: CameraDevice.StateCallback(){
    override fun onOpened(camera: CameraDevice) {
        Log.d("camera", "opened")
        camDevice = camera
        request = camDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE)

        val texture = SurfaceTexture(1)
        texture.setDefaultBufferSize(1, 1)
        request.addTarget(Surface(texture))

        val outputSurface = ArrayList<Surface>(1)
        outputSurface.add(Surface(texture))
        try {
            camDevice.createCaptureSession(outputSurface, CameraCaptureSessionCallBack(), null)
        }catch (e: Exception){}
        event()
    }

    override fun onDisconnected(camera: CameraDevice) {
    }

    override fun onError(camera: CameraDevice, error: Int) {
        Log.d("camera", "err")
    }
}

open inner class CameraCaptureSessionCallBack: CameraCaptureSession.StateCallback(){
    override fun onConfigureFailed(session: CameraCaptureSession) {
        Log.d("CaptureSession", "false")
    }

    override fun onConfigured(session: CameraCaptureSession) {
        camSession = session
        camSession.setRepeatingRequest(request.build(), null, null)
    }
}

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
    if (requestCode == PERMISSIONS_REQUEST_CAMERA) {
        // Request for camera permission.
        if (grantResults.size == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // Permission has been granted. Start camera preview Activity.
            openCamera()
        } else {
            // Permission request was denied.
            Toast.makeText(this, "permission is not granded", Toast.LENGTH_SHORT).show()
        }
    }
}
}

Logcat:

  

07-28 03:59:14.834 7479-7525 / com.example.root.flash   E / CameraDeviceGLThread-0:在GL渲染线程上收到异常:       java.lang.IllegalStateException:swapBuffers:EGL错误:0x3003           在android.hardware.camera2.legacy.SurfaceTextureRenderer.swapBuffers(SurfaceTextureRenderer.java:535)           在android.hardware.camera2.legacy.SurfaceTextureRenderer.drawIntoSurfaces(SurfaceTextureRenderer.java:751)           在android.hardware.camera2.legacy.GLThreadManager $ 1.handleMessage(GLThreadManager.java:105)           在android.os.Handler.dispatchMessage(Handler.java:98)           在android.os.Looper.loop(Looper.java:154)           在android.os.HandlerThread.run(HandlerThread.java:61)07-28 03:59:14.969 7479-7479 / com.example.root.flash E / AndroidRuntime:FATAL   例外:主要       流程:com.example.root.flash,PID:7479       java.lang.RuntimeException:java.lang.reflect.InvocationTargetException           在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)        造成原因:java.lang.reflect.InvocationTargetException           在java.lang.reflect.Method.invoke(本机方法)           在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:889)           在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)        引起原因:android.hardware.camera2.CameraAccessException:CAMERA_ERROR(3):摄像头设备遇到严重错误           在android.hardware.camera2.impl.CameraDeviceImpl.checkIfCameraClosedOrInError(CameraDeviceImpl.java:2023)           在android.hardware.camera2.impl.CameraDeviceImpl.submitCaptureRequest(CameraDeviceImpl.java:891)           在android.hardware.camera2.impl.CameraDeviceImpl.setRepeatingRequest(CameraDeviceImpl.java:938)           在android.hardware.camera2.impl.CameraCaptureSessionImpl.setRepeatingRequest(CameraCaptureSessionImpl.java:243)           com.example.root.flash.FlashActivity $ event $ 1.onClick(FlashActivity.kt:80)           在android.view.View.performClick(View.java:5637)           在android.view.View $ PerformClick.run(View.java:22433)           在android.os.Handler.handleCallback(Handler.java:751)           在android.os.Handler.dispatchMessage(Handler.java:95)           在android.os.Looper.loop(Looper.java:154)           在android.app.ActivityThread.main(ActivityThread.java:6186)           在java.lang.reflect.Method.invoke(本机方法)           在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:889)           在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)

1 个答案:

答案 0 :(得分:0)

已解决。我将val texture = SurfaceTexture(1)移到了onCreate(),并且运行正常