我正在编写一个应用控制闪光灯移动设备,我可以控制闪光灯的开或关。但是它只能运行几次,然后崩溃。
我不明白它崩溃的原因。我很累。
这是我的代码:
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)
答案 0 :(得分:0)
已解决。我将val texture = SurfaceTexture(1)
移到了onCreate()
,并且运行正常