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

ano*_*500 5 android android-permissions usagestatsmanager

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

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();

                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

在这里我也设置了权限:

<uses-permission
    android:name="android.permission.PACKAGE_USAGE_STATS"
    tools:ignore="ProtectedPermissions" />
Run Code Online (Sandbox Code Playgroud)

它不会检测任何应用程序使用情况。我在 stackoverflow 上尝试了其他一些东西,但似乎没有任何效果。我什至在某处读到,应用程序监视手机上运行的其他应用程序的功能已在较新的手机中完全删除。非常感谢任何帮助!

Ste*_*Toe 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;
}
}
Run Code Online (Sandbox Code Playgroud)

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