我一直试图找出如何正确设置CAMERA和ACCESS_FINE_LOCATION在23+上的安卓权限。
我的程序将请求CAMERA,但它不会在运行时请求ACCESS_FINE_LOCATION权限。
我读过权限和位置开发人员页面,但我似乎无法理解如何正确地请求权限。我也通过堆叠寻找答案,但仍然不明白。
有人能解释我在代码中做错了什么,以及如何修复它吗?
我的代码:
private void connectCamera() {
CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA) ==
PackageManager.PERMISSION_GRANTED) {
cameraManager.openCamera(mCameraId, mCameraDeviceStateCallback, mBackgroundHandler);
} else {
if (shouldShowRequestPermissionRationale(android.Manifest.permission.CAMERA)) {
Toast.makeText(this,
"Video app required access to camera and location", Toast.LENGTH_SHORT).show();
}
requestPermissions(new String[]{android.Manifest.permission.CAMERA,
android.Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
}, REQUEST_CAMERA_PERMISSION_RESULT);
}
} else {
cameraManager.openCamera(mCameraId, mCameraDeviceStateCallback, mBackgroundHandler);
}
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CAMERA_PERMISSION_RESULT) {
if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
Toast.makeText(getApplicationContext(),
"Application will not run without camera and location services!", Toast.LENGTH_SHORT).show();
}
}
}发布于 2017-10-24 16:55:01
在您提供的代码中,您没有要求任何地方的权限。要询问位置特性,可以尝试下面的示例:
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
REQUEST_CODE_FINE_GPS);而且,一旦用户允许使用此功能,您就不会让应用程序打开相机。
在onRequestPermissionsResult()方法中,应该添加一个else调用openCamera。
就像这样:
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CAMERA_PERMISSION_RESULT) {
if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
Toast.makeText(getApplicationContext(),
"Application will not run without camera and location services!", Toast.LENGTH_SHORT).show();
}
else {
cameraManager.openCamera(mCameraId, mCameraDeviceStateCallback, mBackgroundHandler);
}
}
}验证步骤大致如下:
onRequestPermissionsResult()方法上。您必须处理那里的用户输入。如果他没有给予许可,并且这个功能是你的应用程序运行所必需的,那么显示一个对话框,或者其他解释为什么他应该给你许可的东西,然后再问一遍。看看这个答案。那个家伙创建了一个很好的助手方法来检查和请求你可能需要的任意数量的权限。然后,您只需在onRequestPermissionsResult()上处理它们。
P.S.: I强烈建议您重新阅读关于如何请求API 23+权限的医生们,您的问题表明您不理解请求权限的基本概念。另外,请查看安卓培训页面的此链接和这个相关的问题。
https://stackoverflow.com/questions/46915957
复制相似问题