症状:首次启动我的应用程序崩溃java.lang.SecurityException: Lacking privileges to access camera service。我收到了“不幸您的应用程序崩溃”对话框,单击“确定”,在此对话框中有两个对话框询问必要的权限。我说“OK”,从现在开始我的应用程序工作。接下来的开始没有崩溃。Android M请求onSurfaceTextureAvailable回调权限不在活动
原因:以后的阅读和调试一段时间,我才理解我的应用程序的问题是,它希望做一些与摄像机相关的逻辑,获得所需的权限(onSurfaceTextureAvailable回调在我CameraHandler类)之前或相机前表面视图来到前景。
关于SO和Github上的类似错误还有很多问题,但是我仍然很难弄清楚。
我试图通过this答案,但我的设置有点不同,即我有我的相机逻辑里面不是一个活动的不同类,我真的很想保持它不混乱我的CameraActivity类。有处理这个问题的好方法吗?
如何确保当我的CameraHandler类中的onSurfaceTextureAvailable被激发时,权限已被授予,以便在第一次运行时我没有获得java.lang.SecurityException: Lacking privileges to access camera service?
这是我SurfaceTextureListener位于CameraHandler类:
private val surfaceTextureListener = object : TextureView.SurfaceTextureListener {
override fun onSurfaceTextureAvailable(surface: SurfaceTexture, width: Int, height: Int) {
openCamera(width, height) //this line here makes my app crash
}
override fun onSurfaceTextureSizeChanged(surface: SurfaceTexture, width: Int, height: Int) {
configureTransform(width, height)
}
override fun onSurfaceTextureDestroyed(surface: SurfaceTexture): Boolean {
return true
}
override fun onSurfaceTextureUpdated(surface: SurfaceTexture) {
}
}
我CameraActivity的onCreate,的onResume(),并在onPause():
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!canAccessCamera() || !canRecordAudio()) {
requestPermissions(INITIAL_PERMISSIONS, INITIAL_REQUEST)
}
}
}
override fun onResume() {
super.onResume()
cameraHandler.startHandler()
}
override fun onPause() {
cameraHandler.stopHandler()
super.onPause()
}
权限内CameraActivity检查
@RequiresApi(api = Build.VERSION_CODES.M)
private fun canAccessCamera() : Boolean {
return (hasPermission(android.Manifest.permission.CAMERA))
}
@RequiresApi(api = Build.VERSION_CODES.M)
private fun canRecordAudio() : Boolean {
return (hasPermission(android.Manifest.permission.RECORD_AUDIO))
}
@RequiresApi(api = Build.VERSION_CODES.M)
private fun hasPermission(perm : String) : Boolean{
return (PackageManager.PERMISSION_GRANTED == checkSelfPermission(perm))
}
@RequiresApi(Build.VERSION_CODES.M)
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == INITIAL_REQUEST) {
if (canAccessCamera() && canRecordAudio()) {
recordButton2.setOnClickListener {
if (isRecording) {
cameraHandler.endRecording()
} else {
currentFileName = generateTimestampName()
createCSVFile(currentFileName)
cameraHandler.startStopRecording()
}
isRecording = !isRecording
}
} else {
Toast.makeText(this, "We need it to perform magic", Toast.LENGTH_SHORT).show()
}
}
}
2017-08-07
lidkxx