文档章节

获取App使用记录

小孩er
 小孩er
发布于 2016/07/28 15:35
字数 711
阅读 73
收藏 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
用Android自带统计服务AppUasge一招制敌

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

Tamic
2017/10/12
0
0
较好用户体验获取 App 使用权限

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

杭城小刘
01/18
0
0
laravel中的错误与日志

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

王二狗子11
01/07
0
0
ThinkPHP2.2框架执行流程图,ThinkPHP控制器的执行流程

ThinkPHP2.2框架执行原理、流程图在线手册 ThinkPHP控制器的执行流程 对用户的第一次URL访问 http://<serverIp>/My/index.php/Index/show/ 所执行的流程进行详细的分析,用户的URL访问首先是...

leycau
2015/07/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

你为什么在Redis里读到了本应过期的数据

一个事故的故事 晚上睡的正香突然被电话吵醒,对面是开发焦急的声音:我们的程序在访问redis的时候读到了本应过期的key导致整个业务逻辑出了问题,需要马上解决。 看到这里你可能会想:这是不...

IT--小哥
59分钟前
0
0
祝大家节日快乐,阖家幸福! centos GnuTLS 漏洞

yum update -y gnutls 修复了GnuTLS 漏洞。更新到最新 gnutls.x86_64 0:2.12.23-22.el6 版本

yizhichao
昨天
3
0
Scrapy 1.5.0之选择器

构造选择器 Scrapy选择器是通过文本(Text)或 TextResponse 对象构造的 Selector 类的实例。 它根据输入类型自动选择最佳的解析规则(XML vs HTML): >>> from scrapy.selector import Sele...

Eappo_Geng
昨天
2
0
Windows下Git多账号配置,同一电脑多个ssh-key的管理

Windows下Git多账号配置,同一电脑多个ssh-key的管理   这一篇文章是对上一篇文章《Git-TortoiseGit完整配置流程》的拓展,所以需要对上一篇文章有所了解,当然直接往下看也可以,其中也有...

morpheusWB
昨天
3
0
中秋快乐!!!

HiBlock
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部