ForegroundApp Checker运行一小时后返回前台应用包名null求助
解决方案
1. 修正权限检测逻辑,避免硬编码错误
原权限检测中使用硬编码字符串"android:get_usage_stats"易出现版本兼容问题,改用系统常量AppOpsManager.OPSTR_GET_USAGE_STATS:
@TargetApi(Build.VERSION_CODES.KITKAT) boolean hasUsageStatsPermission(Context context) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { return true; // 低于5.0版本无需此权限 } 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; }
2. 处理Android后台限制与电池优化
Android 8.0+对后台应用的权限访问有严格限制,若应用进入后台后被系统限制,会导致无法获取前台应用信息:
- 请求忽略电池优化:在Manifest中添加权限
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>,并在代码中发起请求:if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE); if (!pm.isIgnoringBatteryOptimizations(getPackageName())) { Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS); intent.setData(Uri.parse("package:" + getPackageName())); startActivity(intent); } } - 使用前台服务:将你的检测服务设为前台服务,提升进程优先级,避免被系统限制权限访问。
3. 替换老旧第三方库,自行实现前台应用检测
你使用的第三方库适配停留在旧版本Android,对Android 10+支持不足,建议直接通过UsageStatsManager实现检测逻辑:
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP_MR1) public String getForegroundPackageName(Context context) { UsageStatsManager usageStatsManager = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE); long endTime = System.currentTimeMillis(); long startTime = endTime - 1000 * 60; // 查询最近1分钟的应用使用记录 List<UsageStats> usageStatsList = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_BEST, startTime, endTime); if (usageStatsList == null || usageStatsList.isEmpty()) { return null; } UsageStats recentStats = null; for (UsageStats stats : usageStatsList) { if (recentStats == null || stats.getLastTimeUsed() > recentStats.getLastTimeUsed()) { recentStats = stats; } } return recentStats != null ? recentStats.getPackageName() : null; }
调用前需确保已获取PACKAGE_USAGE_STATS权限。
4. 移除无用权限
GET_TASKS权限在Android 5.0(API 21)已被废弃,无需在Manifest中保留,直接删除即可。
内容的提问来源于stack exchange,提问作者Arpit Jaiswal
相关产品推荐
相关产品推荐

