如何获取Amazon Fire TV Stick 4K Max前台运行应用的包名
问题:Amazon Fire TV Stick 4K Max(Android 9)获取前台应用包名
需要开发一款应用监控特定应用是否处于前台,但在该设备上,常规的UsageStatsManager和ActivityManager方法都无法正常获取其他应用的前台包名。
已尝试的方法
方法1:UsageStatsManager
该方法在其他Android 9设备上有效,但在Fire TV Stick 4K Max上无法返回正确结果:
public String packageInForeground() { // 获取UsageStatsManager UsageStatsManager usageStatsManager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE); // 获取最近5秒的使用事件 long currentTime = System.currentTimeMillis(); List<UsageStats> usageStatsList = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_BEST, currentTime - 5000, currentTime); // 查找最新的使用事件 UsageStats latestUsageStats = null; if (usageStatsList != null) { for (UsageStats usageStats : usageStatsList) { if (latestUsageStats == null || usageStats.getLastTimeUsed() > latestUsageStats.getLastTimeUsed()) { latestUsageStats = usageStats; } } } // 获取当前前台应用的包名 String currentForegroundApp = latestUsageStats != null ? latestUsageStats.getPackageName() : ""; Log.d("Service", "Current foreground app: " + currentForegroundApp); return currentForegroundApp; }
方法2:ActivityManager
仅能获取自身应用的包名,切换到其他应用时无法获取目标包名:
public String packageInForeground() { ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> runningAppProcesses = activityManager.getRunningAppProcesses(); String packageName = ""; if (runningAppProcesses != null && runningAppProcesses.size() > 0) { for (ActivityManager.RunningAppProcessInfo processInfo : runningAppProcesses) { if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { packageName = processInfo.processName.split(":")[0]; Log.d("LockService", "Package Name: " + packageName); break; } } } return packageName; }
可行解决方案
针对Fire TV设备的定制化限制,推荐以下可靠方法:
1. 使用AccessibilityService
通过监听窗口状态变化获取前台应用包名,这是目前Fire TV设备上最有效的方式:
步骤1:在AndroidManifest中声明服务
<service android:name=".MyAccessibilityService" android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"> <intent-filter> <action android:name="android.accessibilityservice.AccessibilityService" /> </intent-filter> <meta-data android:name="android.accessibilityservice" android:resource="@xml/accessibility_service_config" /> </service>
步骤2:创建辅助服务配置文件
在res/xml/目录下新建accessibility_service_config.xml:
<?xml version="1.0" encoding="utf-8"?> <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" android:accessibilityEventTypes="typeWindowStateChanged" android:accessibilityFeedbackType="feedbackGeneric" android:accessibilityFlags="flagDefault" android:canRetrieveWindowContent="true" android:description="@string/accessibility_service_description" />
步骤3:实现AccessibilityService类
public class MyAccessibilityService extends AccessibilityService { private String currentForegroundPackage; @Override public void onAccessibilityEvent(AccessibilityEvent event) { if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) { String packageName = event.getPackageName().toString(); currentForegroundPackage = packageName; Log.d("Accessibility", "Foreground package: " + packageName); // 在此处触发你的应用监控逻辑 } } @Override public void onInterrupt() {} public String getCurrentForegroundPackage() { return currentForegroundPackage; } }
注意:用户需要在Fire TV的系统设置中,为你的应用手动开启辅助功能权限。
2. 监听Activity生命周期(局限性场景)
如果仅需监控与自身应用交互的前台状态,可以通过注册ActivityLifecycleCallbacks实现,但无法获取完全独立的第三方应用前台信息。
关键说明
Fire TV设备在系统层面限制了普通应用获取其他应用的前台状态,UsageStatsManager因设备定制化无法返回有效数据,AccessibilityService是目前最稳定的解决方案,唯一的代价是需要用户手动授权。
内容的提问来源于stack exchange,提问作者Chris Meinigmann
相关产品推荐
相关产品推荐

