对android运行时权限感到困惑

2023-12-04

所以这个全新的 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,那么我就可以避免所有这些令人头疼的事情......


我也会检查何时停止相机

假设您没有尝试停止从未打开过的相机,则不需要这样做。如果用户在您的应用程序运行时撤销权限,您的进程将立即终止。因此,您永远不会失去正在运行的应用程序的权限。由于您检查并有权打开相机,因此您已经有权关闭它。

如果我添加此运行时权限检查,这会如何影响低于 6.0 的 Android 设备?

ContextCompat.checkSelfPermission()将返回PackageManager.PERMISSION_GRANTED在旧设备上,假设您拥有清单中列出的权限。

那么5.0.1版本的手机也会提示给予拍照权限吗?

No.

如果我使用运行时权限,是否必须删除清单文件中的相机权限?

不需要。这些元素在所有 Android 版本上都是必需的。

如果我降低目标并将 sdk 编译为 22 而不是 23,6.0 以上的 Android 设备将无法下载我的应用程序怎么办?

Your compileSdkVersion对您支持的 Android 版本没有影响。 Android 6.0 用户仍然可以下载您的应用。

如果你降低你的targetSdkVersion22 或更低,这对您支持的 Android 版本也没有影响。 Android 6.0 用户仍然可以下载您的应用。这样做意味着您可以跳过运行时权限代码。但是,请记住,您可能仍然没有获得许可。 Android 6.0 设备的用户,运行您的targetSdkVersion22 应用程序,将授予CAMERA默认权限。但是,这些用户仍然可以进入“设置”>“应用程序”,找到您的应用程序,然后撤销权限。使用相机API,基本上无法打开相机。

战术上,与targetSdkVersion22 或更低当然是可能的。但最终,有些事情会“迫使你采取行动”并要求你搬到一个地方。targetSdkVersion23 或更高。因此,有一天,您将需要处理运行时权限。无论是今天还是将来的某一天,都由您决定。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对android运行时权限感到困惑 的相关文章

随机推荐

  • 隐藏图表中的元素

    我有一个只读图表来可视化一些数据 我的最终用户希望 过滤 数据 以便一次只能显示数据的子集 我意识到每次应用过滤器时都可以重新绘制整个图表 省略不显示的元素 但我想知道是否有一种方法可以简单地动态 隐藏 一些现有元素 然后重新显示他们 为了
  • jQuery 在 img src 属性中添加 URL

    我只需要一个 jQuery 片段来在 img src 中进行前置 即 img src img picture1 jpg jQuery 代码片段是在这个 url 前面添加 http cdn something com 所以在 jQuery 片
  • 使用 Group By 子查询返回超过 1 个值

    我在使用此表和代码创建查询时遇到一些问题 我知道 GROUP BY Branch BranchName 会导致获取多个记录 但是 如何避免这种情况并在单个查询中做到这一点 我想要得到的是一张桌子 包含分行名称 总付费值 总未付费值 SELE
  • Opscenter 6.0 启动问题

    昨天 我尝试安装 opscenter 并启动现有 DSE 5 0 集群的导入 它失败并出现某些错误 指出安装的版本不是 opscenter 6 0 根本原因 opscenter 安装是从 datastax 社区仓库完成的 而不是企业仓库 我
  • “在非结构或联合中请求成员‘********’”是什么意思?

    对于这个错误的含义有简单的解释吗 request for member in something not a structure or union 我在学习C语言的过程中曾多次遇到过这个词 但我不知道它的含义 如果您在拥有指针时尝试访问实例
  • 在 C# 中使用 Drush 站点安装

    我正在尝试使用 C 中的 Drush 进行 Drupal 站点安装 作为使用 MSI 的完整 Windows Server 站点安装的一部分 我正在使用的 Drush 命令如下 C ProgramData Drush Drush bat y
  • 无法在 Web 服务器上启动调试。操作超时

    我所有的都遇到了这个问题ASP NET网站 我使用的是 Windows 10 并且我的IIS应用程序池停止工作 我在谷歌搜索时发现了很多可能的解决方案 但没有一个对我有用 这不是帐户问题 也不是临时文件中的故障 甚至不是视觉工作室需要重新初
  • Android Java - 如何从 URL 下载 zip 文件?

    嘿 我正在制作一个新项目 需要您从我的 Dropbox 下载一些文件 我添加了一个名为 DownloadFile 的新类 其中包含下载文件的代码 由于某种原因 当我单击下载时 应用程序崩溃了 谢谢 下载文件如下 package com Ma
  • 错误地更新位字段

    我正在尝试解决一个问题 它说 将新变量初始化为值 17512807u 假设我们照常从 0 开始对位进行编号 作为最低有效位 在 右 到 31 最重要 在左边 更新位 18 至 21 的整数值为 8 位 10 到 14 的值为 17 十进制
  • Spring Security 版本 6 存在 SecurityFilterChain 问题

    我正在尝试使用最新版本的 Spring Boot 3 0 6 和 Spring Security 版本 6 制作一个小项目 问题是 Spring 已经弃用了很多有关建立身份验证系统的代码 我们曾经合作过WebSecurityConfigur
  • 为什么不能构造包含 ostringstream 成员的对象?

    我有以下类示例 是从一个较大的项目简化而来的 它基于一个日志记录框架 该框架使用记录器的范围来终止析构函数中的日志条目 下面的代码将无法编译 因为构造函数是一个隐式删除的函数 编辑 不正确 这似乎与std ostringstream目的 我
  • 在 Android 中使用自定义 TTF 会导致文本变得非常难看

    我有一个包含自定义视图的应用程序 我想在其中使用自定义字体 不幸的是 这会导致渲染出非常难看的文本 我的自定义视图扩展了 Surface 刚刚意识到 这是一个坏主意 我使用以下代码绘制文本 p new Paint Typeface font
  • 如何强制Lua脚本运行时间限制?

    使用 dofile 在 lua 中运行一个几乎微不足道的脚本 10000 次 在本机上大约需要 52 秒 但如果我运行 10000 次 lua52 script lua 则需要 3 或 4 倍以上 我知道涉及更多的系统调用和其他开销 但我尝
  • 如何在每次 a4j AJAX 响应后调用 JavaScript 函数?

    我正在使用 JSF w Seam 开发一个 Web 应用程序 我希望能够在每次 ajax 响应后调用 JavaScript 函数 我正在寻找一种方法来做到这一点 而不需要在每个页面上的每个 commandLink commandButton
  • 闪烁和“CreateParams”

    在谷歌搜索后 我想避免应用程序面板中的闪烁4个月以前 在尝试子类面板之后 在这里询问两三次之后 在其他论坛询问之后 没有人有解决方案 但今天我在最后一个答案中奇迹般地找到了解决方案 他们是一种阻止图片框在调整大小时闪烁的方法吗 Protec
  • 使用 WPF 和 MVVM 模式将值从子窗口传递到父窗口

    我有一个父窗口 其中有一个名为 学校名称 的文本框和一个名为 查找学校名称 的按钮 该按钮会打开一个包含学校名称列表的子窗口 现在 当用户从子窗口中选择学校名称 然后单击 使用所选学校 按钮时 我需要在家长视图的文本框中填充选定的学校 注意
  • 有没有办法避免 awk 中的“字符串中的换行”错误?

    包含换行符的 cmdline 参数如何传递给awk 请参阅下面的两个示例 awk v s text BEGIN print s text awk v s n text BEGIN print s awk newline in string
  • 让 CKEditor 与 Flask Admin 一起使用

    我正在尝试将 Flask Admin 文本框转换为 CKEdit 框 如此处所述 但是 当我运行它并转到现有的管理字段时 它不会显示文本框的任何更改 当我运行它并转到为演示而创建的 TestAdmin 字段时 我收到此错误 Operatio
  • jQuery 如何在鼠标按下时触发拖动事件

    好吧 我已经玩了几个小时了 但仍然没有骰子 我正在创建一个界面 允许您拖放图标 内部带有图像的 div 我正在使用jQuery UI 脚本因为他们已经尝试并测试了 div 拖动功能 我的问题是你不能将 div 拖到其父 div 之外 为了解
  • 对android运行时权限感到困惑

    所以这个全新的 Android 运行时权限让我很困惑 我的应用程序当前正在编译并定位版本 23 这意味着我必须使用运行时权限 我的应用程序主要使用相机 api 它需要相机权限 因此我在打开相机之前添加了运行时权限 如下所示 if Conte