2

ActivityManager.getRunningAppProcesses will return only current App since 5.1.1: Build LMY48L. Application needs to have permission REAL_GET_TASK to access process information for all Apps. REAL_GET_TASK is used only in SYSTEM Apps. GET_TASK permission has been deprecated.

Someone told me to use UsageStatsManager,but PACKAGE_USAGE_STATS permission requires API 23(says in https://developer.android.com/reference/android/Manifest.permission.html)

And UsageStatsManager is strange way to get running app,is there any common way to return a running app list?

WannaBeGeek
  • 979
  • 14
  • 32
Dunge
  • 21
  • 5

2 Answers2

1

I have searched everywhere and found just one site that helped me :

Java Code Examples for android.app.usage.UsageStatsManager

To get more information about UsageStatsManager read :

UsageStatsManager

Here is the method to get package name of the running applications in API 22 & above:

private String getProcessName() {
    String foregroundProcess = "";
    ActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(ACTIVITY_SERVICE);
    // Process running
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        UsageStatsManager mUsageStatsManager = (UsageStatsManager)getSystemService(USAGE_STATS_SERVICE);
        long time = System.currentTimeMillis();
        // We get usage stats for the last 10 seconds
        List<UsageStats> stats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000*10, time);
        // Sort the stats by the last time used
        if(stats != null) {
            SortedMap<Long,UsageStats> mySortedMap = new TreeMap<Long,UsageStats>();
            for (UsageStats usageStats : stats) {
                mySortedMap.put(usageStats.getLastTimeUsed(),usageStats);
                Log.d("RunningAppProcessInfo","Package name : "+usageStats.getPackageName());
            }

        }
    } 
}

In log you will able to see package name of running application ...Hope it helps :)

Amit Nayak
  • 583
  • 1
  • 6
  • 17
  • While this link may answer the question, it is better to include the essential parts of the answer here and provide the link for reference. Link-only answers can become invalid if the linked page changes. - [From Review](/review/low-quality-posts/16772989) – V-rund Puro-hit Jul 20 '17 at 12:57
  • 1
    Hi @V-rundPuro-hit edited answered as you have asked. Thanks for the suggestion . :) – Amit Nayak Jul 20 '17 at 13:23
0

Use Rxjava&RxAndroid

private Observable<String> getRunningAppPackageName() {
    return Observable.create(new Observable.OnSubscribe<String>() {
        @Override
        public void call(Subscriber<? super String> subscriber) {
            Process process = null;
            try {
                process = new ProcessBuilder("ps").start();
            } catch (IOException e) {
                subscriber.onError(e);
                return;
            }
            InputStream in = process.getInputStream();
            Scanner scanner = new Scanner(in);
            while (scanner.hasNextLine()) {
                String line = scanner.nextLine();
                if (line.startsWith("u0_")) {
                    String[] temp = line.split(" ");
                    String packageName = temp[temp.length - 1];
                    if (packageName.contains("/")) continue;
                    if (packageName.contains(":")) {
                        packageName = packageName.split(":")[0];
                    }
                    subscriber.onNext(packageName);
                }
            }
            subscriber.onCompleted();
            scanner.close();
            process.destroy();
        }
    });
}

getRunningAppPackageName()
            .subscribeOn(Schedulers.io())
            .onBackpressureBuffer()
            .observeOn(Schedulers.io())
            .distinct()
            .map(new Func1<String, PackageInfo>() {
                @Override
                public PackageInfo call(String s) {
                    PackageInfo packageInfo = null;
                    try {
                        packageInfo = packageManager.getPackageInfo(s, PackageManager.GET_PERMISSIONS);
                    } catch (PackageManager.NameNotFoundException e) {
                    }
                    return packageInfo;
                }
            })
            .filter(new Func1<PackageInfo, Boolean>() {
                @Override
                public Boolean call(PackageInfo packageInfo) {
                    return packageInfo != null;
                }
            }).subscribe(new Subscriber<PackageInfo>() {
                @Override
                public void onCompleted() {

                }

                @Override
                public void onError(Throwable e) {
                    e.printStackTrace();
                }

                @Override
                public void onNext(PackageInfo packageInfo) {
                    // do something
                }
            });
华政强
  • 11
  • 1