如何检查是否授予“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”权限? 的相关文章

  • Android webview 滚动不起作用

    我正在尝试在网络视图中向下滚动到页面底部 我正在使用谷歌在其教程中提供的网络视图示例 我正在使用这行代码来尝试滚动 但它不起作用 mWebView pageDown true 关于如何使其以编程方式滚动有什么建议吗 谢谢 public cl
  • 通过 WhatsApp 发送消息

    由于我发现了一些较旧的帖子 表明 Whatsapp 不支持此功能 我想知道是否发生了变化 以及是否有办法打开与我通过意图发送的号码进行 Whatsapp 聊天 UPDATE请参阅https faq whatsapp com en andro
  • Android 上的 SVG 支持

    Android 支持 SVG 吗 有什么例子吗 最完整的答案是这样的 Android 2 x 默认浏览器本身不支持 SVG Android 3 默认浏览器支持 SVG 要将 SVG 支持添加到 2 x 版本的平台 您有两个基本选择 安装功能
  • 从 Android 代码设置的 SECRET_CODE

    我知道如何使用清单文件中的秘密代码 它与此源代码配合良好
  • 安卓定位不准确

    我正在尝试获取当前用户的位置 我试图重构我的代码以获得更好的结果 但我只是不断得到关于准确度的荒谬位置 它在 900 600 米之间 如何才能得到更好的结果 使其精度达到50m以内 这是我的代码 package com agam mapsl
  • 带操作按钮的颤动本地通知

    我在我的 flutter 项目中尝试了 flutter 本地通知插件 它在简单通知上工作正常 但我需要带有操作按钮的通知功能 请帮助我或建议我实现此功能 不幸的是 flutter local notifications 插件尚不支持操作按钮
  • 从 React Native Js 代码调用 Android Native UI 组件方法

    我创建了一个 CustomView SignatureView java 它扩展了 LinearLayout 以捕获 Android Native 中的签名 并创建了SignatureCapturePackage java和Signatur
  • Android 自定义布局 - onDraw() 永远不会被调用

    public class MainActivity extends Activity Override public void onCreate Bundle savedInstanceState super onCreate savedI
  • 如何在android中设置权限WRITE_SECURE_SETTINGS? [复制]

    这个问题在这里已经有答案了 我正在尝试启用 4 0 以上的辅助功能服务设置 但它显示异常 即 引起原因 java lang SecurityException 权限拒绝 写入安全设置需要 android permission WRITE S
  • Camera.open()返回NULL Android开发

    我正在按照构建相机应用程序的教程进行操作http developer android com tools device html http developer android com tools device html我对 Camera o
  • Android 应用程序中的 Eszett (ß)

    我的 res layout activity 文件中的德语 字符在我的应用程序中自动转换为 ss 即使我将语言和键盘设置为德语 它仍然不会显示 Android 中可以显示 吗 edit
  • 如何在TableLayout中创建三列

    我正在开发一个使用的屏幕TableLayout 在这里我可以轻松创建两列 但我怎样才能创建三列呢 这里有一个例子
  • 使用 PhoneGap 使 Android 应用程序易于访问(对于残障人士)

    有人有过使用 PhoneGap 使 Android 应用程序可访问的经验吗 至少我们需要使我们的应用程序符合第 508 条规定 我尝试实现一些标准的辅助功能 文本框标签 向 div 添加标题属性等 但是 当在 Android 中使用 Tal
  • 在旋转时从错误的资源文件夹中提取可绘制对象

    在这里拉我的头发 因此 我正在使用一个具有多种类型的可绘制对象的应用程序 并且它们的结构如下 res Portrait resources drawable mdpi drawable hdpi drawable xhdpi Landsca
  • 在 React Native 中调试应用程序崩溃

    我是 React Native 新手 我正在尝试安装 React Native Facebook SDK 以便我可以使用我的应用程序进行 Facebook 登录 我按照此处列出的步骤操作 https tylermcginnis com in
  • Android 后台服务示例,具有交互式调用方法

    我不是 Android 方面的专家 我正在寻找一个 Android 应用程序的示例 该应用程序使用一个服务 其中有真正的功能方法 或者换句话说 一个服务可以用来做什么 我们什么时候需要它 超越简单的东西服务举例 我确信您渴望获得一些工作代码
  • Android:AsyncTask ProgressDialog 将不会在 ActivityGroup 中打开

    我试图在轮询我的服务器时打开一个进度对话框 该类是一个 ActivityGroup 因为它嵌套在选项卡栏中 为了将视图保持在框架内 需要 ActivityGroup 这是我的 ActivityGroup 类的声明 public class
  • javafx android 中的文本字段和组合框问题

    我在简单的 javafx android 应用程序中遇到问题 问题是我使用 gradle javafxmobile plugin 在 netbeans ide 中构建了非常简单的应用程序 其中包含一些文本字段和组合框 我在 android
  • 如何在基本活动中使用 ViewBinding 的抽象?

    我正在创建一个基类 以便子级的所有绑定都将设置在基类中 我已经做到了这一点 abstract class BaseActivity2 b AppCompatActivity private var viewBinding B null pr
  • 使用 JobScheduler API 进行位置更新

    下面是我使用 FireBaseJobDispatcher 启动作业的演示代码 public class MainActivity extends AppCompatActivity Override protected void onCre

随机推荐

  • 每次调用都在 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 显现