相关疑难解决方法(0)

Android marshmallow请求权限?

我目前正在开发一个需要几个"危险"权限的应用程序.因此,我尝试在Android Marshmallow(API级别23)中添加"请求许可",但无法找到如何执行此操作.

如何在我的应用中使用新的权限模型请求权限?

android android-permissions android-6.0-marshmallow

151
推荐指数
8
解决办法
24万
查看次数

如何检查是否给出了"android.permission.PACKAGE_USAGE_STATS"权限?

背景

我正在尝试获取应用程序启动的统计信息,并且在Lollipop上可以通过使用UsageStatsManager类来实现(原始帖子在这里):

表现:

<uses-permission
    android:name="android.permission.PACKAGE_USAGE_STATS"
    tools:ignore="ProtectedPermissions"/>
Run Code Online (Sandbox Code Playgroud)

打开活动,让用户确认给您这个权限:

startActivity(new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS));
Run Code Online (Sandbox Code Playgroud)

获取统计数据,汇总:

 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);
Run Code Online (Sandbox Code Playgroud)

问题

我似乎无法检查是否授予您所需的权限("android.permission.PACKAGE_USAGE_STATS").到目前为止我所做的一切总是会让人感到被拒绝.

代码有效,但权限检查不起作用.

我试过的

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

String permission = "android.permission.PACKAGE_USAGE_STATS";
boolean granted=getContext().checkCallingOrSelfPermission(permission) == PackageManager.PERMISSION_GRANTED;   
Run Code Online (Sandbox Code Playgroud)

或这个:

String permission = "android.permission.PACKAGE_USAGE_STATS";
boolean granted=getPackageManager().checkPermission(permission,getPackageName())== PackageManager.PERMISSION_GRANTED;   
Run Code Online (Sandbox Code Playgroud)

两者总是返回它被拒绝(即使我已经授予用户权限).

看看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;
Run Code Online (Sandbox Code Playgroud)

它工作,但它仍然是一个解决方法.

这个问题

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

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

permissions android usage-statistics android-recents usagestatsmanager

40
推荐指数
2
解决办法
2万
查看次数

从 Android StorageManager 获得的存储 UUID 无效?

我因为一些琐碎的事情而失去了整整一天,但现在我只是放弃并需要你的帮助。

在用于读取应用程序代码/数据/缓存/大小的新 Oreo API 中,我们需要存储 UUID(StorageStatsManager.queryStatsForUid(UUID storageUuid, int uid))。

存储 UUID 可以从StorageManager.getStorageVolumes()获取,它返回所有存储的列表,其中也包含 UUID。

问题开始了:返回列表中的 UUID 是字符串格式,而StorageStatsManager.queryStatsForUid(UUID storageUuid, int uid)需要 UUID 对象 - 没有更简单的 - 存在方法UUID.fromString(String name)可以在一段时间内转换它。 . 但是等等,StorageManager 列表中的 UUID 值与 UUID 解析器不兼容 -什么?!我检查了 2 台设备(一台带奥利奥,一台带牛轧糖),都有外部存储器,每台设备我都有 2 个存储:

  1. UUID 的内部设备内存等于“null” - 这很好,因为文档中对此进行了描述
  2. 具有 UUID 值的外部卡存储,格式为“4012-1A4B”,什么是无效的 UUID 格式并导致 UUID.fromString 抛出 IllegalArgumentException。

谁能解释一下我做错了什么,我应该如何获取外部存储的 UUID?或者只是新的 API StorageStatsManager.queryStatsForUid(UUID storageUuid, int uid)没用,因为我们无法获得存储 UUID?


供参考:

更重要的是还有另一个 StackOverflow 问题,其中将此 API 的使用标记为正确的解决方案:https : …

uuid storage android android-8.0-oreo

9
推荐指数
2
解决办法
1748
查看次数