文档章节

获取App使用记录

小孩er
 小孩er
发布于 2016/07/28 15:35
字数 711
阅读 78
收藏 0

使用UsageStatsManager获取app运行记录

UsageStatsManager出现在android 5.0 API21之后,5.0之前是没有这个类的

	// 获取app的UsageStats
	public static List<UsageStats> getUsageStatsList(Context context) {
		UsageStatsManager usm = (UsageStatsManager) context
				.getSystemService("usagestats");
		Calendar calendar = Calendar.getInstance();
		long endTime = calendar.getTimeInMillis();
		calendar.add(Calendar.YEAR, -1);
		long startTime = calendar.getTimeInMillis();
		List<UsageStats> usageStatsList = usm.queryUsageStats(
				UsageStatsManager.INTERVAL_DAILY, startTime, endTime);
		return usageStatsList;
	}

	// 读取UsageStats里数据
	public static void printUsageStats(List<UsageStats> usageStatsList)
			throws IllegalAccessException, IllegalArgumentException,
			NoSuchFieldException {
		for (UsageStats u : usageStatsList) {
			String pkgName = u.getPackageName();// 包名
			Long foregroundtime = u.getTotalTimeInForeground();// 运行时长:
			int launcherCount = u.getClass().getDeclaredField("mLaunchCount")
					.getInt(u);// 运行次数,不能直接访问,反射获取
		}
	}

通常情况下默认是拿不到数据的,需要给予权限,并打开相应开关,部分手机开关页是隐藏的,需要代码跳转。

//需要的权限,再manifest注册后,则可以在“查看使用情况权限”控制页控制本app
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />
//跳转的方法
public static void statrtUsageAccessActivity(Context context) {
	Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
	context.startActivity(intent);
}

/data/system/usagestats 

-rw------- system   system      12992 2016-07-23 08:31 usage-20160722
-rw------- system   system       6532 2016-07-24 01:11 usage-20160723
-rw------- system   system        976 2016-07-25 08:18 usage-20160724
-rw------- system   system       9848 2016-07-26 05:25 usage-20160725
-rw------- system   system       7308 2016-07-26 17:57 usage-20160726
-rw------- system   system      50802 2016-07-26 05:25 usage-history.xml

其中usage-history.xml如下

<usage-history>
    <pkg name="com.sogou.activity.src">
        <comp name="com.sogou.weixintopic.read.WeixinHeadlineReadFirstActivity" lrt="1468237211692" />
        <comp name="com.sogou.activity.src.wxapi.WXEntryActivity" lrt="1467711877007" />
        <comp name="com.sogou.activity.src.SplashActivity" lrt="1468501310396" />
        <comp name="com.sogou.search.result.SuggestionActivity" lrt="1468237220015" />
        <comp name="com.sogou.search.result.SogouSearchActivity" lrt="1468405345331" />
        <comp name="com.sogou.activity.src.NewUserAnimGuideActivity" lrt="1467689925626" />
        <comp name="com.sogou.weixintopic.read.PicNewsReadActivity" lrt="1467710313758" />
        <comp name="com.sogou.weixintopic.read.activity.CommentListActivity" lrt="1467710289689" />
        <comp name="com.sogou.search.entry.EntryActivity" lrt="1468501310836" />
    </pkg>
    <pkg name="com.xiaomi.account">
        <comp name="com.xiaomi.account.ui.AuthorizeActivity" lrt="1466477718040" />
        <comp name="com.xiaomi.account.ui.LoginActivity" lrt="1465135903157" />
        <comp name="com.xiaomi.account.ui.AccountSettingsActivity" lrt="1465199758416" />
        <comp name="com.xiaomi.account.ui.WelcomeActivity" lrt="1465135903193" />
        <comp name="com.xiaomi.account.ui.UserDetailInfoActivity" lrt="1465175067590" />
        <comp name="com.xiaomi.account.ui.SnsListActivity" lrt="1465135914454" />
    </pkg>
    <pkg name="com.android.updater">
        <comp name="com.android.updater.MainActivity" lrt="1465955978078" />
    </pkg>
...............
</usage-history>

-----------------------分割线---------------------------------

4.4.4之前 

 com.android.internal.app.IUsageStats

 android 4.4.4_r1 4.4.3_r1 4.4.2_r1 4.4.1_r1 4.4_r1 4.3.1_r1 4.3_r2.1 4.3_r1 

4.2.2_r14.2.1_r1.2 4.2_r1 4.1.2_r1 4.1.1_r1 、4.0.4_r2.1 4.0.4_r1.2 2.0_r1 ...

应该是可以通过这个类获取相关信息

需要系统级app才可以

参考链接:blog.csdn.net/tanwei4199/article/details/17527145

// use reflect
	// have to root and push into system/app
	private void getPkgUsageStats()
    {
		try {
			Class<?> cServiceManager = Class
					.forName("android.os.ServiceManager");
			Method mGetService = cServiceManager.getMethod("getService",
					java.lang.String.class);
			Object oRemoteService = mGetService.invoke(null, "usagestats");

			// IUsageStats oIUsageStats =
			// IUsageStats.Stub.asInterface(oRemoteService)
			Class<?> cStub = Class
					.forName("com.android.internal.app.IUsageStats$Stub");
			Method mUsageStatsService = cStub.getMethod("asInterface",
					android.os.IBinder.class);
			Object oIUsageStats = mUsageStatsService.invoke(null,
					oRemoteService);

			// PkgUsageStats[] oPkgUsageStatsArray =
			// mUsageStatsService.getAllPkgUsageStats();
			Class<?> cIUsageStatus = Class
					.forName("com.android.internal.app.IUsageStats");
			Method mGetAllPkgUsageStats = cIUsageStatus.getMethod(
					"getAllPkgUsageStats", (Class[]) null);
			Object[] oPkgUsageStatsArray = (Object[]) mGetAllPkgUsageStats
					.invoke(oIUsageStats, (Object[]) null);
			System.out.println(oPkgUsageStatsArray);

			Class<?> cPkgUsageStats = Class
					.forName("com.android.internal.os.PkgUsageStats");

			StringBuffer sb = new StringBuffer();
			sb.append("nerver used : ");
			for (Object pkgUsageStats : oPkgUsageStatsArray) {
				// get pkgUsageStats.packageName, pkgUsageStats.launchCount,
				// pkgUsageStats.usageTime
				String packageName = (String) cPkgUsageStats.getDeclaredField(
						"packageName").get(pkgUsageStats);
				int launchCount = cPkgUsageStats
						.getDeclaredField("launchCount").getInt(pkgUsageStats);
				long usageTime = cPkgUsageStats.getDeclaredField("usageTime")
						.getLong(pkgUsageStats);
				if(launchCount > 0)
					Log.v("getPkgUsageStats",packageName + "  count: " + launchCount + "  time:  "
						+ usageTime);
				else{
					sb.append(packageName+" ");
				}
			}
			Log.v("getPkgUsageStats",sb.toString());
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

 

--------------------------------------------------------------

获取权限除了跳转到页面,手动给予之外 还可以利用下面的方式进行代码操作。

android权限管理--AppOpsManager

    android自带的 ,4.3出现4.4

AppOpsManagerCompat

    v4包下类 用来适配低版本android环境

7.0之后推荐使用 RuntimePermission

© 著作权归作者所有

共有 人打赏支持
小孩er

小孩er

粉丝 0
博文 12
码字总数 3722
作品 0
朝阳
程序员
私信 提问
laravel源码阅读(绑定与解析服务)

1. 环境配置 laravel5.1.46的源码 PHPstorm开发工具 服务器集成环境(mamp、wamp)安装xdebug扩展 2. 关键点 使用PHPstorm+xdebug进行源码阅读时需点击(F7按钮)进入到下一个执行代码的方法...

彩虹的夜晚
05/30
0
0
laravel中的错误与日志

日志 laravel中的日志是基于monolog而封装的。laravel在它上面做了几个事情: 把monolog中的addInfo等函数简化成为了info这样的函数 增加了useFiles和useDailyFiles两个参数,使得做日志管理...

王二狗子11
01/07
0
0
较好用户体验获取 App 使用权限

较好用户体验获取 App 使用权限 目前市面上大多数的 App 获取权限都是在用户在使用该功能的时候弹出获取权限的请求,这样子用户在用的时候弹出来要么给予权限,要么关闭权限这种方式显得用户...

杭城小刘
01/18
0
0
用Android自带统计服务AppUasge一招制敌

Tamic/文 Google从 API 21 新增了接口 android.app.usage , 通过这个api我们可以统计到每个app的使用情况,启动次数,启动时间等,也可以判断是否前后台,比较方便,今天就来深入的学习一下 ...

10/28
0
0
自定义统计SDK--TcStatInterface

TcStatInterface是自定义统计SDK,完全放弃第三方平台,让app拥有自主的数据统计功能,支持页面统计自定义事件统计APP启动退出统计,不同渠道统计。 客户端SDK功能概述 在使用统计服务前,开...

匿名
2016/07/05
303
0

没有更多内容

加载失败,请刷新页面

加载更多

FinderWeb2.4.9 程序员的看日志利器

FinderWeb2.4.9 程序员的看日志利器 使用方法:管理员登录,分配对应用户的的主机和文件权限即可。 部署方式: 下载并解压到webapps目录即可 http://www.finderweb.net/download/finder-web...

吴伟祥
14分钟前
0
0
PHP的pcntl进程控制教程一(pcntl_fork)

pcntl 简介 PHP的进程控制支持实现了Unix方式的进程创建, 程序执行, 信号处理以及进程的中断。 进程控制不能被应用在Web服务器环境,当其被用于Web服务环境时可能会带来意外的结果。 这份文档...

hansonwong
19分钟前
0
0
php扩展模块安装

11月21日任务 11.32 php扩展模块装安装 /usr/local/php/bin/php -m //查看模块 下面安装一个redis的模块 cd /usr/local/src/ wget https://codeload.github.com/phpredis/phpredis/zip/deve......

zgxlinux
20分钟前
2
0
windows下使用IDEA创建VUE项目

1.环境搭建 1.1检测是否安装好nodejs和npm 检测命令 node -v npm -v 如果没有安装需要先安装 nodejs的下载路径:https://nodejs.org/en/download/ 在Windows上安装时务必选择全部组件,包括勾...

文文1
27分钟前
2
0
Mybatis插件plugin应用测试,替换查询sql

1、新建插件 import org.apache.ibatis.executor.CachingExecutor;import org.apache.ibatis.executor.Executor;import org.apache.ibatis.executor.parameter.ParameterHandler;im......

jcc_codingBoy
32分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部