如何在Ionic 3安卓应用中获取其他应用的启动与结束时间?
Ionic 3安卓应用获取其他应用使用时间的实现方案
安卓系统本身提供了对应的能力实现这个需求,核心依赖系统自带的UsageStatsManager API,Ionic 3场景下可以通过Cordova插件封装调用,具体方案如下:
1 系统权限要求
首先需要申请特殊的应用使用统计权限,普通的动态申请无法生效:
- 需在AndroidManifest.xml中添加权限声明:
android.permission.PACKAGE_USAGE_STATS - 首次启动应用时要引导用户手动跳转至系统「应用使用情况访问权限」页,给你的应用开启权限
- 适配安卓12及以上系统还需要额外添加权限:
android.permission.QUERY_ALL_PACKAGES,否则无法获取所有应用的包名信息
2 核心API说明
UsageStatsManager是安卓5.0之后开放的系统级API,专门用于统计应用使用情况,你需要的字段都可以通过这个API获取:
queryUsageStats(时间区间类型, 开始时间, 结束时间):返回指定时间范围内所有应用的使用统计列表- 每个统计项的
getFirstTimeStamp()返回对应应用在查询区间内首次进入前台的时间(即你需要的启动时间) - 每个统计项的
getLastTimeStamp()返回对应应用在查询区间内最后一次离开前台的时间(即你需要的结束时间) - 额外还可以拿到
getTotalTimeInForeground()获取应用在区间内的总前台使用时长
3 Ionic 3适配方案
Ionic 3基于Cordova框架,你可以直接用现成的Cordova插件封装调用,也可以自己开发自定义插件:
- 方案一:使用开源的cordova-plugin-usage-stats插件,安装后直接通过全局
window.UsageStats对象调用相关方法,无需自己写原生代码 - 方案二:自定义Cordova插件,自己封装
UsageStatsManager的调用逻辑,根据你的需求定制返回的字段和查询逻辑,灵活度更高
4 代码示例
4.1 Ionic前端调用示例
// 声明全局插件对象 declare let window: any; // 先检查权限 checkUsagePermission() { window.UsageStats.hasPermission((isGranted: boolean) => { if (!isGranted) { // 跳转权限设置页引导用户授权 window.UsageStats.openPermissionSetting(); return; } // 查询过去24小时的应用使用数据 const endTime = Date.now(); const startTime = endTime - 24 * 60 * 60 * 1000; window.UsageStats.queryUsageStats(startTime, endTime, (statsList: any[]) => { statsList.forEach(appStat => { console.log('应用包名:', appStat.packageName); console.log('启动时间:', new Date(appStat.firstTimeStamp)); console.log('结束时间:', new Date(appStat.lastTimeStamp)); console.log('总前台时长:', appStat.totalTimeInForeground); }); }); }); }
4.2 安卓原生逻辑参考(自定义插件时使用)
UsageStatsManager usageStatsManager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE); long endTime = System.currentTimeMillis(); long startTime = endTime - 1000 * 60 * 60 * 24; List<UsageStats> usageStatsList = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, startTime, endTime); for (UsageStats stat : usageStatsList) { // 过滤掉系统应用或者使用时长为0的无效数据 if (stat.getTotalTimeInForeground() <= 0) continue; String pkgName = stat.getPackageName(); long appStart = stat.getFirstTimeStamp(); long appEnd = stat.getLastTimeStamp(); // 把数据返回给JS层 }
5 注意事项
- 仅支持安卓5.0及以上系统,更低版本安卓没有开放对应的能力,无法实现需求
- 如果用户拒绝授予使用统计权限,你完全无法获取其他应用的使用数据,需要做好无权限的降级交互
- 获取的用户应用使用数据属于敏感隐私数据,仅可用于用户明确授权的个人行为分析场景,避免违反隐私合规要求
内容的提问来源于stack exchange,提问作者Akash B
相关产品推荐
相关产品推荐

