我正在写一个应用程序控制手机闪光灯,我可以控制闪光灯开或关。但它只工作了几次,然后就崩溃了。
我不明白它坠毁的原因。我很累。
这是我的代码:
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)