如何检查是否授予“android.permission.PACKAGE_USAGE_STATS”权限?

2023-12-08

背景

我正在尝试获取应用程序启动的统计信息,在 Lollipop 上可以使用使用情况统计管理器类,本身(原帖here):

显现:

<uses-permission
    android:name="android.permission.PACKAGE_USAGE_STATS"
    tools:ignore="ProtectedPermissions"/>

打开让用户确认授予您此权限的活动:

startActivity(new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS));

获取统计数据,汇总:

 private static final String USAGE_STATS_SERVICE ="usagestats"; // Context.USAGE_STATS_SERVICE);
 ...
 final UsageStatsManager usageStatsManager=(UsageStatsManager)context.getSystemService(USAGE_STATS_SERVICE);
 final Map<String,UsageStats> queryUsageStats=usageStatsManager.queryAndAggregateUsageStats(fromTime,toTime);

问题

我似乎无法检查是否授予了您需要的权限(“android.permission.PACKAGE_USAGE_STATS”)。到目前为止我所做的所有尝试总是返回它被拒绝。

代码可以工作,但是权限检查不能很好地工作。

我尝试过的

您可以使用以下任一方式检查是否授予了权限:

String permission = "android.permission.PACKAGE_USAGE_STATS";
boolean granted=getContext().checkCallingOrSelfPermission(permission) == PackageManager.PERMISSION_GRANTED;   

or this:

String permission = "android.permission.PACKAGE_USAGE_STATS";
boolean granted=getPackageManager().checkPermission(permission,getPackageName())== PackageManager.PERMISSION_GRANTED;   

两者总是返回它被拒绝(即使我已经以用户身份授予了权限)。

查看UsageStatsManager的代码,我尝试想出这个解决方法:

      UsageStatsManager usm=(UsageStatsManager)getSystemService("usagestats");
      Calendar calendar=Calendar.getInstance();
      long toTime=calendar.getTimeInMillis();
      calendar.add(Calendar.YEAR,-1);
      long fromTime=calendar.getTimeInMillis();
      final List<UsageStats> queryUsageStats=usm.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY,fromTime,toTime);
      boolean granted=queryUsageStats!=null&&queryUsageStats!=Collections.EMPTY_LIST;

它有效,但它仍然是一种解决方法。

问题

为什么我没有得到正确的权限检查结果?

应该怎么做才能更好的检查呢?


用户在系统设置中授予的特殊权限(使用情况统计访问、通知访问等)由应用运营管理器,这是在Android 4.4中添加的。

请注意,除了用户授予您在系统设置中的访问权限之外,您通常还需要 Android 清单(或某些组件)中的权限,否则您的应用程序甚至不会显示在系统设置中。对于您需要的使用统计数据android.permission.PACKAGE_USAGE_STATS允许。

关于这一点的文档并不多,但您可以随时检查 Android 源代码。 该解决方案可能看起来有点老套,因为后来添加了一些常量AppOpsManager,并且一些常量(例如用于检查不同的权限)仍然隐藏在私有 API 中。

AppOpsManager appOps = (AppOpsManager) context
        .getSystemService(Context.APP_OPS_SERVICE);
int mode = appOps.checkOpNoThrow("android:get_usage_stats", 
        android.os.Process.myUid(), context.getPackageName());
boolean granted = mode == AppOpsManager.MODE_ALLOWED;

这会告诉您用户是否授予了该权限。 请注意,自 API 级别 21 起,存在恒定的AppOpsManager.OPSTR_GET_USAGE_STATS = "android:get_usage_stats".

我在 Lollipop(包括 5.1.1)上测试了此检查,它按预期工作。它告诉我用户是否给出了明确的许可而没有任何崩溃。 还有方法appOps.checkOp()这可能会引发SecurityException.

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

如何检查是否授予“android.permission.PACKAGE_USAGE_STATS”权限? 的相关文章

  • 如何自定义 Firebase 身份验证 ui

    我正在使用 Firebase Auth Ui 进行号码验证 我有一些要求 需要更改国家旋转器下拉项目的文本和背景颜色 我正在使用下面的样式 但它不会改变下拉菜单的背景颜色或项目的文本颜色 style name FirebaseUI Coun
  • 在 Android 模拟器上运行完整的 Android 手机 ROM

    正如标题所说 是否可以在 Android 模拟器中运行完整的 Android 设备 ROM 是的 你可以 但让它 100 工作可能很困难 大多数 ROM 都包含其运行硬件的特定驱动程序 我并不是 100 全力以赴 但可以尝试以下步骤 创建
  • animation.start() 或animation.startNow() 不会立即开始动画

    我有一个奇怪的问题 有时应该淡出我的控件 ImageButton 的动画不会立即启动 我使用淡出动画来隐藏它 然后在 myListener 的末尾 onAnimationEnd 中 我将新资源作为按钮上的图像 我的应用程序代码中的某处 An
  • Android:将图像裁剪为特定尺寸

    我的目的是让用户从图库中选择一张图像 然后进行裁剪活动 但是 我需要将定义裁剪蒙版的矩形锁定到某个尺寸 然后用户只需重新定位它即可显示图像的一部分 关于如何做到这一点有什么想法吗 Thanks T Intent intent new Int
  • 使用全局变量从内部函数获取空字符串

    请帮助我解决一些小问题 我确信你能做到 D 我试图在 firestore 文档 user cases information 上设置一个字段 其中包含一个字段 case number 首先我声明这个全局变量 private String c
  • 如果未安装应用程序,深层链接将重定向到 Play 商店

    我在我的应用程序中使用深度链接的概念 我真正想要的是 当我共享我的应用程序中的链接时 它工作正常 它会转到我想在我的应用程序中打开的活动 但问题是当用户没有这个时应用程序此链接通过手机浏览器打开 显示错误 未找到 但如果未安装应用程序 我想
  • 可以用 Django 制作移动应用程序吗?

    我想知道我是否可以在我的网站上使用 Django 代码 并以某种方式在移动应用程序 Flutter 等框架中使用它 那么是否可以使用我现在拥有的 Django 后端并在移动应用程序中使用它 所以就像models views etc 是的 有
  • webview 中的 android 移动 Twitter 页面无法打开?

    我正在尝试打开以 https 开头的 Twitter 页面webview在安卓中 但它没有打开 并且持续加载时出现黑屏 屏幕截图如下 Edit 在主网络视图中我有 Twitter 页面的链接https twitter com mytwitt
  • FileObserver 不适用于 Android 6.0 Marshmallow (API 23) 中的外部存储

    我有一个应用程序可以观察外部存储上的公共目录FileObserver 它运行良好Lollipop设备 我想添加对Marshmallow 所以我用它设置了一台 Nexus 9 平板电脑 在 Marshmallow 设备上 它失败 在 Loll
  • 如何在移动应用程序上连接到服务器?

    我是移动应用程序的新手 我基本上来自网络开发平台 我只是在玩 App Framework LungoJS Jquery Mobile kendo 等移动框架 以获得该垂直领域的一些知识 我正在开发的应用程序仍然处于 UI 级别 我所需要的只
  • Android 应用程序不需要任何特殊访问权限

    当我开始安装时myapp apk 我得到下面的屏幕 我的应用程序需要位置 外部存储权限 上述权限应该根据需要向用户请求 即在需要这些权限的代码之前 现在 当安装应用程序时 我会看到一个屏幕 上面显示应用程序不需要任何特殊访问权限 如下图所示
  • Android 中的 ODEX 文件是什么?

    经过一些android安装了应用程序 我发现它会变成odex文件 不是apk 在智 能手机中 这是怎么发生的 谁能教教我 我对此很感兴趣 博客文章 https stackoverflow com a 9593590 194894大部分是正确
  • 通过 Google 帐户从 Google Play 安装的应用程序列表

    以下是我的问题 是否可以通过使用任何 api 以编程方式通过 Google Play 获取用户已安装的应用程序列表 请注意 我并不是询问设备中当前安装的应用程序列表 而是询问在某个时刻已安装的应用程序列表 我需要解决上述问题 因为我正在考虑
  • Dart/Flutter 如何编译到 Android?

    我找不到任何具体的资源 Dart 是否被编译到 JVM 或者 Google 的团队是否编译了 Dart VM 以在 JVM 上运行 然后在 JVM 内的 Dart VM 中运行 Dart 前者更有意义 并且符合 无桥 的口号 但后者似乎更符
  • 如何在android中将文本放在单选按钮的左侧

    我想将单选按钮的文本放在左侧而不是右侧 我找到了这个解决方案
  • Recyclerview项目点击涟漪效果[重复]

    这个问题在这里已经有答案了 我正在尝试添加Ripple影响到RecyclerView的项目 我在网上查了一下 但找不到我需要的东西 我努力了android background归因于RecyclerView本身并将其设置为 android
  • 带有不透明导航栏的深色文本透明状态栏

    等等 这不是重复的 类似的问题已被问到here https stackoverflow com questions 38025865 android fully transparent status bar with non transpa
  • 连接到具有相同 SSID 的最强接入点(信号最强的接入点)

    我正在编写一个程序来始终连接到最强的接入点 我的意思是信号最强的接入点 首先 我扫描所有可用的 WiFi 网络 然后限制它们仅查看具有相同 SSID 的网络 这样我就可以看到一个网络的所有AP 当我连接到该网络时 它没有连接到最强的信号 但
  • 如何使用socket.io发送图像文件(二进制数据)?

    我无法从以下位置发送数据Android Client to NodeJS Server I use Socket IO 客户端 https github com socketio socket io client java我的客户端中的ja
  • (Unity 中的 Firebase 数据库)在 Android 构建期间在 Temp 中缺少classes.jar

    I am using Firebase Database in my Unity project but I am having some issues when building the project for android It ru

随机推荐

  • 每次调用都在 WCF 中进行身份验证

    我以完全断开连接的方式从 Silverlight 应用程序使用大量 WCF 服务 我想确保我知道调用每个服务的用户 但我不知道是否有 标准方式 我想到了一种登录方法来获取令牌 然后在每次调用中传递用户名及其令牌 以确保他 她已登录并有权执行
  • 如果多个字符在方案中彼此相邻,则从列表中删除它们

    我必须制作一个 Dr Racket 程序 如果列表中的字母与其本身相同 则将其从列表中删除 例如 z z f a b b d d 将变为 z f a b d 我已经为此编写了代码 但它所做的只是从列表中删除第一个字母 有人可以帮忙吗 lan
  • 在液体中连接数组

    我试图在 Liquid jekyll 中连接三个数组 但在最终数组 出版物 中我只得到第一个数组 论文 的元素 assign papers site publications where type paper sort date rever
  • 为什么同时使用匿名枚举和定义宏作为常量? [复制]

    这个问题在这里已经有答案了 为什么netinet in h这样定义常量 enum IPPROTO IP 0 define IPPROTO IP IPPROTO IP IPPROTO HOPOPTS 0 define IPPROTO HOPO
  • 无法从 Google Analytics 检索超过 10k 条记录

    我开发了一个 Windows 控制台应用程序 它提取 Google Analytics 数据并写入 CSV 文件 当在 Google Analytics 查询浏览器上查询特定日期的数据时 它显示 您的查询匹配 96782 个结果 问题是当我
  • Notepad++ 替换文本内的新行

    我有这个样本 因为它是一百万行中的一个 我有这样的文字 tr class even td a href http www ujk edu pl Jan Kochanowski University of Humanities and Sci
  • 如何在我的扫描仪之前调用 GUI 代码?

    在打开 GUI 窗口之前 我在从命令行获取输入时遇到一些问题 我之前在 Apple Exchange 上问过这个问题 但在我们确定这是一个编程问题后 我将其发送到这里 基本上 我在打开窗口之前运行扫描仪来获取用户输入 但它会启动程序 在我的
  • 尝试从.asp页面连接到远程mysql

    我正在尝试从经典 ASP 页面连接到远程 MySQL 数据库 当我在其中编写 VBScript 代码时 网站给出HTTP 500 Internal Server错误 我向房东核实过 他们说这不是他们的错误 请帮我
  • 递归还是迭代?

    我喜欢递归 我认为这让事情变得简单很多 另一个人可能不同意 我认为这也使代码更容易阅读 然而 我注意到递归在 C 等语言中的使用并不像在 LISP 中那样多 顺便说一下 由于递归 LISP 是我最喜欢的语言 有人知道在 C 等语言中是否有充
  • 使用对话框时背景模糊

    我希望对话框后面的背景变得模糊 我使用了这段代码 但它使整个背景变黑而不是模糊 dialog new Dialog context R style Theme Dialog Translucent dialog requestWindowF
  • Rails 3.2.4 SQL 查询在 find(:all) 上缓存结果

    我不完全确定该系统是否正在缓存数据 但它具有一些缓存特征 基本上我在搞乱 Rails 3 2 4 系统开始不显示一些结果 我认为这与我放入代码模型中的默认范围有关 但即使如此 这也应该显示所有结果 而不是十分之九 但是 我总是会丢失我创建的
  • 如何使用 Python 3.5 和 BeautifulSoup 抓取 href [重复]

    这个问题在这里已经有答案了 我想从网站上抓取每个项目的 href使用 Python 3 5 和 BeautifulSoup 这是我的代码 Loading Libraries import urllib import urllib reque
  • Google Maps API v3:自定义标记在移动设备上不可点击

    我们有一个网站 它使用 Google Maps API v3 在地图上显示一堆标记 这些标记是可点击的 并打开一个标准的谷歌地图信息弹出窗口 这在所有桌面浏览器上都非常有效 但由于某种原因 我无法让它在我测试过的任何移动设备 各种 Andr
  • jquery多维数组随机洗牌

    我想最小化我的代码 myArrayA 1 2 3 4 5 fisherYates myArrayA myArrayB 6 7 8 9 10 fisherYates myArrayB myArrayC 11 12 13 14 15 fishe
  • 我们可以在finally块中使用“return”吗[重复]

    这个问题在这里已经有答案了 我们可以使用 return 语句吗finally堵塞 这会导致任何问题吗 从a内返回finally阻塞会导致exceptions丢失 finally 块内的 return 语句将导致 try 或 catch 块中
  • OSX 以编程方式调用声级图形

    我有一个可以在 OSX 下更改音量的应用程序 它缺少的是按下声音上 下键时提供的视觉反馈 有谁知道如何以编程方式调用该行为 谢谢 以下是 George Warner 和 Casey Fleser 编写的一些代码 用于实现此目的 仔细想想这是
  • 对 Java 中另一个类中实例化/初始化的对象的引用变量

    我问的原因是因为我收到 NullPointerException 我现在这很容易 但我是一个相当新的编程人员 发现这有点令人困惑 假设我已经初始化了一个类中的一个对象 并且想要从另一个类访问同一对象 就像现在 我正在开发一个小型国际象棋游戏
  • Linux 中 Socket 的发送缓冲区为空?

    有没有办法检查 TCP 连接的发送缓冲区是否完全为空 到目前为止我还没有找到任何东西 只是想确保在仍有数据传输到某个客户端时我的服务器没有关闭连接 我正在使用轮询来检查是否能够在非阻塞套接字上发送数据 但这样我就无法知道是否所有内容都已发送
  • CSS多行省略号跨浏览器

    我的网页中有一个具有固定宽度和高度的 div 以下 css 仅适用于单行文本 overflow hidden text overflow ellipsis white space nowrap 如何使用具有跨浏览器兼容性的纯 css 在该
  • 如何检查是否授予“android.permission.PACKAGE_USAGE_STATS”权限?

    背景 我正在尝试获取应用程序启动的统计信息 在 Lollipop 上可以使用使用情况统计管理器类 本身 原帖here 显现