代码之家  ›  专栏  ›  技术社区  ›  mducc

egl错误:0x3003,相机设备遇到严重错误(camera2 api)

  •  0
  • mducc  · 技术社区  · 7 年前

    我正在写一个应用程序控制手机闪光灯,我可以控制闪光灯开或关。但它只工作了几次,然后就崩溃了。

    我不明白它坠毁的原因。我很累。

    这是我的代码:

    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上。硬件。Copa2.2. Prime.SurtEtExeTurrEnter。SWAPBoffs(SureTeExTurrReNeDel.java:535) 在Android上。硬件。Copa2.2.遗产。SureTeExtReReNeDel.DrWoToSururFACTS(SureTeExTurrEnEnrder-Java: 751) 在Android。硬件。Copa2.2.遗产。GLthRead管理器$ 1。 在安卓.OS.Halder-Debug消息(HANDL.java:98) 在安卓.OS.Looper-Loo.(循环器.java:154) 在Android .OS.HooLeReult.Run(HooRelTyth.java:61)0728 03:59: 14.969 779—779/COM.Excel。ROOT.Flash E/ANDROIDRunTimes:致命的 例外:主要 进程:com.example.root.flash,PID:7479 java.lang.RuntimeException:java.lang.Reflect.InvocationTargetException 在COM.Android .No.OS.ZyGoTyIn.Mault(ZyGoTynIt.java:779) 原因:java.lang.reflect.invocationTargetException 在java. 在COM.Android .No.OS.ZyGoTynIt方法和AdjSculal.Run(ZyGoTynIt.java:889) 在COM.Android .No.OS.ZyGoTyIn.Mault(ZyGoTynIt.java:779) 原因:android.hardware.camera2.cameraAccessException:camera_error(3):摄像头设备遇到严重错误 在Android上。硬件。 在Android上。硬件。 在Android上.硬件.CopyA2.IMP.CasaMaGeDaveIMP.StimeSimulink请求(CasaAdvEclipse IMP.java:938) 在Android上。硬件。 在com.example.root.flash.flashactivity$event$1.onclick(flashactivity.kt:80) 在Android上.View .View。PrimultCutlook(View,Java:5637) 在Android .view .View $PrimultCalk.Run(view .java:22433) 在安卓.OS.Halder-HooLeCalBe后退(Helt.java:751) 在安卓.OS.Halder-Debug消息(HANDL.java:95) 在安卓.OS.Looper-Loo.(循环器.java:154) 在Addio.App.ActuviyTrime.Mead(ActuviyToel.java:6186) 在java. 在COM.Android .No.OS.ZyGoTynIt方法和AdjSculal.Run(ZyGoTynIt.java:889) 在COM.Android .No.OS.ZyGoTyIn.Mault(ZyGoTynIt.java:779)

    1 回复  |  直到 7 年前
        1
  •  0
  •   mducc    7 年前

    val texture = SurfaceTexture(1) onCreate()