【问题标题】:Android Lollipop know if app as Usage Stats accessAndroid Lollipop 知道应用程序是否作为 Usage Stats 访问
【发布时间】:2014-12-06 09:46:33
【问题描述】:

自 Android Lollipop 以来,我们现在有了一个用于访问应用使用统计信息的 API。但是,您的应用必须由用户授予这些权限。

我知道使用 Settings.ACTION_USAGE_ACCESS_SETTINGS 将用户重定向到这些设置。

现在,我的问题是您如何知道用户已授予您这些权限,以便您可以停止将他重定向到设置。

谢谢!

【问题讨论】:

标签: android android-5.0-lollipop usage-statistics android-recents


【解决方案1】:

您可以简单地使用当前时间的每日间隔和结束时间查询 usagestats,如果没有返回任何内容,则表示用户尚未授予权限

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public boolean doIHavePermission(){


    final UsageStatsManager usageStatsManager = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
    final List<UsageStats> queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, 0,  System.currentTimeMillis());

    return !queryUsageStats.isEmpty();
}

开始日期为 0 和结束日期为当前时间的每日间隔必须至少返回今天的使用情况。因此只有在未授予权限时才会为空。

【讨论】:

  • 感谢您的回答。这实际上是我已经在做的,我希望有一种更清洁的方式。特别是因为这些查询有点慢。
  • 也许您可以限制时间范围,例如将开始日期设置为昨天以返回更少的统计信息。但我明白你的意思......
  • 如果你放一个大的时间范围会花费太长,如果你放一个短的,可能会发生用户没有使用手机......无论如何,如果没有人提出在接下来的几天里有一个更好的答案,我会接受你的。谢谢
  • 这也是我们的做法。我们坚持一个“最后能够获得任何使用情况统计数据”的时间戳,如果它> 0,则该权限必须存在。谷歌似乎还没有发布直接获取此设置的方法。如果您查看 Android src 代码,它似乎在那里有一个,但在 SDK 中还无法访问(不是公共设置)。仅供参考 另请注意,我们已经确定了一些完全缺少 app.usage 功能的“Android 5”设备(到目前为止,LG G3 和三星 S5)。
【解决方案2】:

检查这个答案: Tomik's answer

如果你快点,这里有解决方案;)

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public static boolean usageAccessGranted(Context context) {
       AppOpsManager appOps = (AppOpsManager)context.getSystemService(Context.APP_OPS_SERVICE);
       int mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS,
       android.os.Process.myUid(), context.getPackageName());
       return mode == AppOpsManager.MODE_ALLOWED;
    }

【讨论】:

  • 在 lollipop 5.1 中,即使未启用,它也始终返回 true。
【解决方案3】:

我偶然发现了同样的问题。在三星 S5 Lollipop 上,使用统计信息无法使用以下代码:

Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

但是实际存在使用情况统计信息。使用以下代码可以打开安全设置:

Intent intent = new Intent(Settings.ACTION_SECURITY_SETTINGS);
intent.setComponent(new ComponentName("com.android.settings","com.android.settings.Settings$SecuritySettingsActivity"));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

滚动到底部并显示使用统计信息。我还检查了日志并通过按使用情况统计信息,您将被定向到包含 UsageStats 片段的子活动。我尝试了以下代码:

Intent intent = new Intent();
intent.setComponent(new ComponentName("com.android.settings", "com.android.settings.SubSettings"));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

但出现安全异常。问题是他们没有将 SubActivity 标记为 exported,所以据我所知,它不可能直接启动 SubActivity(使用统计窗口)。唯一的解决方案是将用户带到 Securiy 设置,然后他们告诉他手动转到使用情况统计视图并启用应用程序。

如果有人找到更好的解决方案,那就太好了!

【讨论】:

  • 我知道这有点晚了,但我设法用Intent intent = new Intent(); intent.setComponent(new ComponentName("com.android.settings", "com.android.settings.Settings$UsageAccessSettingsActivity")); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);做到了
  • 这是一个很好的答案,但它在错误的问题中。你能把它移到这里吗? stackoverflow.com/q/27874224/238753
  • @EduardoHerzer,我在运行 Android 5.0 G900IZTU1BOA1 固件的三星 Galaxy S5 SM-G900I 上测试了您的解决方案,但它对我不起作用。您还记得您使用的设备和固件吗?你能确认Settings.ACTION_USAGE_ACCESS_SETTINGS 没用吗?
【解决方案4】:

ActivityNotFoundException in Lollipop when trying to launch activity with intent android.settings.USAGE_ACCESS_SETTINGS 为了更好的方法,因为使用方法我们无法辨别时间间隔是否有简单的无统计信息

【讨论】:

  • 你能从你的链接中发布相关内容吗?
  • 这不会告诉您设置是否设置为 true。这个另一个线程正在处理一些 Android 5 构建实际上缺少整个应用程序使用库(或至少是意图名称)的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 2017-02-11
  • 1970-01-01
  • 2015-03-10
  • 2011-10-14
  • 2019-04-21
相关资源
最近更新 更多