对android运行时权限感到困惑
Posted
技术标签:
【中文标题】对android运行时权限感到困惑【英文标题】:confused about android runtime permissions 【发布时间】:2016-05-16 20:29:40 【问题描述】:所以这个全新的 android 运行时权限让我感到困惑。我的应用程序当前正在编译和定位版本 23,这意味着我必须使用运行时权限。我的应用程序主要使用需要相机权限的相机 api,所以我在打开相机之前添加了运行时权限:
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,那么我就避免了所有这些头痛......
【问题讨论】:
你可以在 Fragments github.com/mptrista/PermissionHelper 中查看我创建的一个类并使用它,它是用于片段和请求单个权限的情况。 【参考方案1】:我还会检查何时停止相机
这不是必需的,假设您没有尝试停止您从未打开过的相机。如果用户在您的应用程序运行时撤销权限,您的进程将立即终止。因此,您永远不会失去正在运行的应用程序的权限。由于您检查并有权打开相机,因此您已经有权关闭它。
如果我添加此运行时权限检查这对低于 6.0 的 android 设备有何影响?
ContextCompat.checkSelfPermission()
将在旧设备上返回 PackageManager.PERMISSION_GRANTED
,假设您拥有清单中列出的权限。
那么5.0.1版本的手机也会提示授予摄像头权限?
没有。
如果我使用运行时权限,我是否必须在清单文件中删除相机权限?
没有。所有 Android 版本都需要这些元素。
如果我降低目标并将 sdk 编译为 22 而不是 23,6.0 以上的 android 设备将无法下载我的应用程序吗?
您的compileSdkVersion
对您支持的 Android 版本没有影响。 Android 6.0 用户仍然可以下载您的应用。
如果您将targetSdkVersion
降低到 22 或更低,这也不会影响您支持的 Android 版本。 Android 6.0 用户仍然可以下载您的应用。这样做意味着您可以跳过运行时权限代码。但是,请记住,您可能仍然没有权限。运行targetSdkVersion
22 应用程序的Android 6.0 设备用户将默认授予CAMERA
权限。但是,这些用户仍然可以进入“设置”>“应用程序”,找到您的应用程序并撤销权限。使用camera API,基本上是打不开摄像头的。
从战术上讲,使用 22 或更低的 targetSdkVersion
肯定是可能的。不过,最终,有些东西会“强迫你的手”,并要求你移动到 23 或更高的targetSdkVersion
。因此,总有一天,您将需要处理运行时权限。是今天还是未来的某一天,由您决定。
【讨论】:
我在调用活动 onpause 时停止摄像头,当我执行权限提示时它会到达那里我的活动进入暂停状态,然后在没有权限时尝试停止摄像头所以...【参考方案2】:如果权限在 Menifest 文件中,则否。少于 23 sdk 的 Android 不会收到权限提示,和之前一样。
【讨论】:
以上是关于对android运行时权限感到困惑的主要内容,如果未能解决你的问题,请参考以下文章