android 权限开启回调,Android M请求onSurfaceTextureAvailable回调权限不在活动

症状:首次启动我的应用程序崩溃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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值