Android UsageStatsManager:获取手机上当前正在运行的应用程序列表

5

我正在尝试获取手机上当前正在运行的应用程序列表。这是我正在使用的代码:

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
            UsageStatsManager usm = (UsageStatsManager)this.getSystemService(Context.USAGE_STATS_SERVICE);
            long time = System.currentTimeMillis();
            List<UsageStats> appList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY,  time - 10000*10000, time);
            if (appList != null && appList.size() == 0) {
                Log.d("Executed app", "######### NO APP FOUND ##########" );
            }
            if (appList != null && appList.size() > 0) {
                SortedMap<Long, UsageStats> mySortedMap = new TreeMap<Long, UsageStats>();
                for (UsageStats usageStats : appList) {
                    Log.d("Executed app", "usage stats executed : " +usageStats.getPackageName() + "\t\t ID: ");
                    mySortedMap.put(usageStats.getLastTimeUsed(), usageStats);
                }
                if (mySortedMap != null && !mySortedMap.isEmpty()) {
                    String currentApp = mySortedMap.get(mySortedMap.lastKey()).getPackageName();

                }
            }
        }

我在这里也设置了权限:

<uses-permission
    android:name="android.permission.PACKAGE_USAGE_STATS"
    tools:ignore="ProtectedPermissions" />

它没有检测到任何应用程序的使用。我在stackoverflow上尝试了一些其他方法,但似乎都没有效果。我甚至在某个地方读到过,在新款手机中,应用程序监视其他正在运行的应用程序的能力已完全删除。非常感谢任何帮助!


你尝试过这个代码吗?ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfo = am.getRunningAppProcesses(); - SteelToe
然后使用 runningAppProcessInfo.get(i).processName 获取每个进程对应的应用程序包名字符串。 - SteelToe
1
@SteelToe 我试过了,但只能给我我的应用程序和谷歌搜索栏,而手机上还有很多其他应用程序在运行。 - anon_945500
你确定在尝试代码时获取了适当的权限了吗? - SteelToe
1个回答

1
问题在于您的应用程序没有 android:get_usage_stats 系统权限。
您可以使用以下代码检查是否拥有该权限:
public static boolean needPermissionForBlocking(Context context){
try {
    PackageManager packageManager = context.getPackageManager();
    ApplicationInfo applicationInfo = packageManager.getApplicationInfo(context.getPackageName(), 0);
    AppOpsManager appOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
    int mode = appOpsManager.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, applicationInfo.uid, applicationInfo.packageName);
    return  (mode != AppOpsManager.MODE_ALLOWED);
} catch (PackageManager.NameNotFoundException e) {
    return true;
}
}

如果您没有权限,则用户必须通过转到“设置” ->“安全性” ->“具有使用访问权限的应用程序”,然后添加您的应用程序来启用此权限。然后,您的代码应该可以正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接