我将开始一个重大项目,我必须选择我需要定位的iOS SDK版本.为此,我最近有关于在iPhone上使用ios 5和6的统计数据.
哪里可以找到这些统计数据?
谷歌已弃用getRecentTasks
"ActivityManager"类的功能" ".现在它所做的只是获取当前应用程序已打开的应用程序列表.
我甚至在StackOverflow上写了一篇关于它的帖子,但我发现这是不可能的.
我发了一篇关于它的帖子(在这里,另一个,类似的由其他人创建,在这里),并要求重新考虑它,谷歌决定创建一个新类,似乎提供类似的功能(更像是统计,但也可能有用),但我无法找到如何使用它.
该类称为" UsageStatsManager
",我的猜测是函数" queryUsageStats
"完成工作.
此外,它似乎有一个新的权限(" android.permission.PACKAGE_USAGE_STATS
"),这是一个系统权限,但它写道:
声明权限意味着使用API的意图,设备用户可以通过Settings应用程序授予权限.
我查看了Android的代码,并注意到"Context"有USAGE_STATS_SERVICE,在JavaDocs中说下一件事:
/**
* Use with {@link #getSystemService} to retrieve a {@link
* android.app.UsageStatsManager} for interacting with the status bar.
*
* @see #getSystemService
* @see android.app.UsageStatsManager
* @hide
*/
public static final String USAGE_STATS_SERVICE = "usagestats";
Run Code Online (Sandbox Code Playgroud)
奇怪的是,不仅它说" status bar
",而且packageName也不匹配(应该是" android.app.usage.UsageStatsManager
").
我还添加了正确的权限:
<uses-permission
android:name="android.permission.PACKAGE_USAGE_STATS"
tools:ignore="ProtectedPermissions" />
Run Code Online (Sandbox Code Playgroud)
这是我使用的代码:
final UsageStatsManager …
Run Code Online (Sandbox Code Playgroud) android usage-statistics activity-manager android-recents usagestatsmanager
我试图在每个应用程序的基础上找出Android上的数据使用情况.像Android数据使用应用程序和配额/上限监视器小部件:永远不会收取额外的数据或再次上限!.
我查看了Stack Overflow问题如何在Android环境中检测数据使用情况.
但它并没有多大帮助.
ActivityManager activityManager = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
ActivityManager.MemoryInfo mInfo = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo( mInfo );
List<RunningAppProcessInfo> listOfRunningProcess = activityManager.getRunningAppProcesses();
Log.d(TAG, "XXSize: " + listOfRunningProcess.size());
for (RunningAppProcessInfo runningAppProcessInfo : listOfRunningProcess) {
if (runningAppProcessInfo.uid > 1026)
{
Log.d(TAG, "ANS " + runningAppProcessInfo.processName +
" Id :" + runningAppProcessInfo.pid +
" UID: " + runningAppProcessInfo.uid);
}
}
Run Code Online (Sandbox Code Playgroud)
我按照Akos Cz的建议尝试了上面的代码.但是,与上面提到的不同,所有UID都是数字app_79
.这样可以吗?
我正在尝试获取应用程序启动的统计信息,并且在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
手头的问题:我必须创建一个Service
连续运行的.这项服务监控5个应用程序说你的手机上安装了5个安卓游戏.此服务需要获取以下信息:1.游戏开启和运行的次数是多少?2.每场比赛的运行时间.
例如:说如果我在我的应用程序中安装了此服务.我让它运行了一个月.我需要在应用程序的屏幕上显示此类信息:
游戏 游戏运行次数游戏 持续时间
第1场比赛共20次,共15小时
游戏2共16次,总共玩25小时
..
..
第5场比赛共10次,共12小时
可能的方法:当应用程序加载时,它会进入内存.注意到系统在应用程序启动时计时.当应用程序结束或放在后台注意时间再次.
所以说如果一个应用程序在晚上9点被带到内存并且在晚上9:30退出到后台,这给了我们30分钟的游戏时间.下次播放应用程序时,持续时间将从存储在某种变量中的上一个播放添加到30,依此类推.每次将应用程序带入内存时,正在播放的计数器应该增加1.因此,给我们一个应用程序播放的次数.
编码:
我Service
在Android中根本不知道,因为我从来没有真正研究它们.任何与我手头的问题相关的教程都会非常有用.其次,如果还有另一种方法可以做到这一点.我也想知道.我真的可以使用一些代码片段来启动这个项目.
您可能知道,自Android 5启动以来,访问设备的最近任务(使用情况统计信息)需要用户手动启用此功能(设置 - >安全 - >使用权限).
我的应用程序检查设备是否使用Android 5,如果是,则为用户提供打开设置屏幕以启用使用权限的可能性:
Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
startActivityForResult(intent, 12345);
Run Code Online (Sandbox Code Playgroud)
当我尝试在运行Android 5的三星设备中执行此操作时出现问题...当执行上面显示的行时出现此错误:
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.settings.USAGE_ACCESS_SETTINGS }
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1801)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1499)
at android.app.Activity.startActivityForResult(Activity.java:3913)
Run Code Online (Sandbox Code Playgroud)
似乎尚未实现Settings.ACTION_USAGE_ACCESS_SETTINGS操作,这很奇怪,因为如果您转到"设置"选项以启用应用程序以访问此使用情况统计信息是...
知道如何解决这个特定情况下的这个问题?
android usage-statistics samsung-mobile android-5.0-lollipop
我正在使用新的UsageStatsManager
API来获取 Android 5.0 Lollipop中的当前前台应用程序.要使用此API,用户必须在Settings->Security->Apps with usage access
屏幕中启用该应用程序.
我使用此Intent将用户直接发送到此屏幕:
startActivity(new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS));
Run Code Online (Sandbox Code Playgroud)
现在,我想验证用户启用我的应用程序.我想这样做,就像我验证用户启用我的应用程序使用NotificationListenerService
但我不知道什么是String键,如果它甚至存在.
Settings.Secure.getString(contentResolver, "enabled_notification_listeners");
// Tried Settings.ACTION_USAGE_ACCESS_SETTINGS as key but it returns null
第二种方法是查询使用情况统计信息并检查它是否返回结果(当应用程序未启用时返回一个空数组)并且它大部分时间都有效,但有时即使我的应用程序启用也会返回0结果.
UsageStatsManager mUsageStatsManager = (UsageStatsManager) context.getSystemService("usagestats");
long time = System.currentTimeMillis();
List stats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000 * 10, time);
if (stats == null || stats.isEmpty()) {
// Usage access is not enabled
}
Run Code Online (Sandbox Code Playgroud)
有没有办法检查我的应用程序是否启用了使用权限?
我需要跟踪Android中的应用程序使用情况,例如AppUsage的工作方式(即跟踪应用程序启动的数量,以及使用每个应用程序所花费的时间).我打算做的是记录应用程序启动时的开始时间,然后获取应用程序暂停或停止时的结束时间.在LogCat中,我能够看到Activity的起始日志.我查看了可用的系统广播,我不确定在活动开始时是否有任何广播..基本上,我如何检测活动何时启动?
编辑:此外,Android还有一个内部使用的使用情况统计系统,可以在备件应用程序或*#*#4636#*#*
拨打时找到(测试 - >使用情况统计)
每当我尝试查询UsageStatsManager的Usage Stats时,我都可以正确地获取最后一个正在运行的应用程序.但是,如果我下拉状态栏并且有新通知,则最后使用的应用程序(基于UsageStats)将更改为通知的应用程序.结果,我收到前台应用程序已更改的错误警报.
我似乎无法找到过滤那些特定抽奖的方法.有任何想法吗?
现在,我使用以下代码查询前台应用程序.问题仅存在于Marshmallow中(5.X正常工作).
UsageStatsManager mUsageStatsManager = (UsageStatsManager) rotationManager.getSystemService("usagestats");
long time = System.currentTimeMillis();
// We get usage stats for the last 10 seconds
List<UsageStats> stats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000 * 2, time);
// Sort the stats by the last time used
if (stats != null) {
SortedMap<Long, UsageStats> mySortedMap = new TreeMap<Long, UsageStats>();
for (UsageStats usageStats : stats) {
mySortedMap.put(usageStats.getLastTimeUsed(), usageStats);
}
if (mySortedMap != null && !mySortedMap.isEmpty()) {
foregroundApp = mySortedMap.get(mySortedMap.lastKey()).getPackageName();
}
}
Run Code Online (Sandbox Code Playgroud) 您能否建议我可以使用一个库来检测我的.NET桌面应用程序,以收集用户的UI使用信息 - 移动鼠标的方式和时间,导航菜单,单击按钮,使用组合和列表框等.
因此,在每个用户会话或一段时间之后,我可以获得有关我的应用程序的所有用户操作的快照信息.
如果该库将附带分析模块,该模块可以帮助分析使用数据,则构建热图并提供有关如何更改UI以使其更好的一些建议.那就是 - "UI剖析器".或者至少如果它提供"使用数据播放器",那么我可以使用本地PC上的应用程序或以某种原理图方式重新播放用户会话.
库本身应该是非侵入式的,允许"注入"UI统计信息收集代码而不需要更改现有应用程序(.NET).
如果你可以推荐一个免费的/开源库来做这件事 - 它会很棒,但如果我做了我需要的东西,我不介意买一个商业版.
usage-statistics ×10
android ×8
.net ×1
ios5 ×1
ios6 ×1
iphone ×1
permissions ×1
service ×1
winforms ×1
wpf ×1