You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 11:43:27