对android运行时权限感到困惑
所以这个全新的android运行时权限让我感到困惑。我的应用程序目前正在编译并针对版本23,这意味着我必须使用运行时权限。我的应用程序主要使用需要摄像头权限的摄像头api,因此我在打开摄像头之前添加了运行时权限,如下所示:对android运行时权限感到困惑,android,android-camera,android-permissions,runtime-permissions,target-sdk,Android,Android Camera,Android Permissions,Runtime Permissions,Target Sdk,所以这个全新的android运行时权限让我感到困惑。我的应用程序目前正在编译并针对版本23,这意味着我必须使用运行时权限。我的应用程序主要使用需要摄像头权限的摄像头api,因此我在打开摄像头之前添加了运行时权限,如下所示: if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSI
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED)
{//ask permissions for camera
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CAMERA},
CameraPermissions);
}
else
{//permissions attained now you can open the camera
camera=Camera.open(getCid());
camera.setPreviewCallback(this);
initPreview(width, height);
startPreview();
startTimer();
}
当我停止相机时,我也会检查:
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.CAMERA)
== PackageManager.PERMISSION_GRANTED) {
camera.setPreviewCallback(null);
camera.release();
faceProc.release();
faceProc = null;
camera = null;
inPreview = false;
cameraConfigured = false;
}
权限请求的处理方式如下:
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case CameraPermissions: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
StartUpCam();
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("How is this app going to work if you rejected the camera permission.... DUHHHH!!")
.setTitle("Rejected");
builder.setPositiveButton("Exit App", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
//close application
closeApp();
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
return;
}
}
}
因此,当发出请求时,它会调用StartUpCam,然后在获得许可的情况下尝试打开摄像头。所以我的问题来了,如果我添加这个运行时权限检查这对低于6.0的android设备有何影响??那么,5.0.1版的手机也会收到提示,要求授予摄像头权限?如果使用运行时权限,是否必须删除清单文件中的摄影机权限?目前,我在清单中保留相机权限以及运行时权限,我不知道这是否正确。如果我降低目标并将sdk编译为22而不是23,6.0以上的android设备将无法下载我的应用程序吗???如果我把它降低到22版,那么我就避免了所有这些头痛
我也会检查我什么时候停止相机
这是不必要的,假设你没有试图停止你从未打开过的相机。如果用户在您的应用程序运行时撤销了权限,您的进程将立即终止。因此,在运行中的应用程序中,您永远不会失去权限。由于您已检查并拥有打开相机的权限,因此您已经拥有关闭相机的权限
如果我添加此运行时权限,将检查这对低于6.0的android设备有何影响
ContextCompat.checkSelfPermission()
将返回在旧设备上授予的PackageManager.PERMISSION\u,前提是您拥有清单中列出的权限
那么,5.0.1版的手机也会收到提示,要求授予摄像头权限
没有
如果使用运行时权限,是否必须删除清单文件中的摄影机权限
不需要。所有Android版本都需要这些元素
如果我降低目标并将sdk编译为22而不是23,6.0以上的android设备将无法下载我的应用程序吗
您的compileSdkVersion
对您支持的Android版本没有影响。Android 6.0用户仍然可以下载您的应用程序
如果您将targetSdkVersion
降低到22或更低,这也不会影响您支持的Android版本。Android 6.0用户仍然可以下载您的应用程序。这样做意味着您可以跳过运行时权限代码。但是,请记住,您可能仍然没有获得许可。运行您的targetSdkVersion
22应用程序的安卓6.0设备用户,默认情况下将授予CAMERA
权限。但是,这些用户仍然可以进入设置>应用程序,找到你的应用程序,并撤销权限。使用摄影机API,基本上无法打开摄影机
战术上,使用22或更低的targetSdkVersion
当然是可能的。不过,最终会有一些东西“强迫你”并要求你移动到23或更高的targetSdkVersion
。所以,有一天,您将需要处理运行时权限。这是今天还是将来的某一天,取决于您的决定。如果权限在Menifest文件中,则为否。拥有少于23个sdk的Android不会收到关于权限的提示,它将与以前一样 当调用“活动onpause”时,我停止相机,当我执行权限提示时,它到达那里。我的活动转到“onpause”,然后当它没有权限停止相机时,尝试停止相机…您可以检查我创建的一个类,并在Fragments github.com/mptrista/PermissionHelper中使用它,它用于片段和请求单个权限的案例。