Android 5.1.1 and above - getRunningAppProcesses() returns my application package only Android 5.1.1 and above - getRunningAppProcesses() returns my application package only android android

Android 5.1.1 and above - getRunningAppProcesses() returns my application package only


To get a list of running processes on Android 1.6 - Android 6.0 you can use this library I wrote: https://github.com/jaredrummler/AndroidProcesses The library reads /proc to get process info.

Google has significantly restricted access to /proc in Android Nougat. To get a list of running processes on Android Nougat you will need to use UsageStatsManager or have root access.

Click the edit history for previous alternative solutions.


 private String printForegroundTask() {    String currentApp = "NULL";    if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {        UsageStatsManager usm = (UsageStatsManager)this.getSystemService("usagestats");        long time = System.currentTimeMillis();        List<UsageStats> appList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY,  time - 1000*1000, time);        if (appList != null && appList.size() > 0) {            SortedMap<Long, UsageStats> mySortedMap = new TreeMap<Long, UsageStats>();            for (UsageStats usageStats : appList) {                mySortedMap.put(usageStats.getLastTimeUsed(), usageStats);            }            if (mySortedMap != null && !mySortedMap.isEmpty()) {                currentApp = mySortedMap.get(mySortedMap.lastKey()).getPackageName();            }        }    } else {        ActivityManager am = (ActivityManager)this.getSystemService(Context.ACTIVITY_SERVICE);        List<ActivityManager.RunningAppProcessInfo> tasks = am.getRunningAppProcesses();        currentApp = tasks.get(0).processName;    }    Log.e("adapter", "Current App in foreground is: " + currentApp);    return currentApp;}

Use this method for getting foreground task. U will need an System Permission "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;    }}

IF user enable this in setting -> Security-> app with usage access. After that u will get foreground task. Similar process Clean matser by Cheetahamobilegoogle play link


Take a look at https://github.com/ricvalerio/foregroundappchecker, it might be what you need. Provides sample code, and takes away the pain of having to implement cross version foreground detector.

Here are two samples:

AppChecker appChecker = new AppChecker();String packageName = appChecker.getForegroundApp();

Or regularly check:

AppChecker appChecker = new AppChecker();appChecker    .when("com.other.app", new AppChecker.Listener() {        @Override        public void onForeground(String packageName) {            // do something        }    )    .when("com.my.app", new AppChecker.Listener() {        @Override        public void onForeground(String packageName) {            // do something        }    )    .other(new AppChecker.Listener() {        @Override        public void onForeground(String packageName) {            // do something        }    )    .timeout(1000)    .start(this);