Как использовать сервис, чтобы получить информацию о том, какое приложение открыто? - PullRequest
0 голосов
/ 27 марта 2019

Я новичок в Android.Я занимаюсь разработкой блокировщика приложений, который использует идентификатор лица вместо обычного пин-кода, используя kotlin.У меня есть список установленных приложений в системе.Но как получить информацию о том, какое приложение открывается с помощью сервиса? Пожалуйста, помогите.

1 Ответ

0 голосов
/ 27 марта 2019

Как это:

Java-версия

    private String retriveAppInForeground() {
        String currentApp = null;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
            UsageStatsManager usm = (UsageStatsManager) this.getSystemService(Context.USAGE_STATS_SERVICE);
            long time = System.currentTimeMillis();
            List<UsageStats> appList = null;
            if (usm != null) {
                appList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000 * 1000, time);
            }
            if (appList != null && !appList.isEmpty()) {
                SortedMap<Long, UsageStats> sortedMap = new TreeMap<>();
                for (UsageStats usageStats : appList) {
                    sortedMap.put(usageStats.getLastTimeUsed(), usageStats);
                }
                if (!sortedMap.isEmpty()) {
                    currentApp = sortedMap.get(sortedMap.lastKey()).getPackageName();
                }
            }
        } else {
            ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
            if (am != null) {
                currentApp =(am.getRunningTasks(1).get(0)).topActivity.getPackageName();
            }
        }
        Log.e("ActivityTAG", "Application in foreground: " + currentApp);
        return currentApp;
    }

Kotlin версия

    private fun retriveAppInForeground(): String? {
        var currentApp: String? = null
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
            val usm = this.getSystemService(Context.USAGE_STATS_SERVICE) as UsageStatsManager
            val time = System.currentTimeMillis()
            val appList: List<UsageStats>?
            appList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000 * 1000, time)
            if (appList != null && appList.isNotEmpty()) {
                val sortedMap = TreeMap<Long, UsageStats>()
                for (usageStats in appList) {
                    sortedMap.put(usageStats.lastTimeUsed, usageStats)
                }
                currentApp = sortedMap.takeIf { it.isNotEmpty() }?.lastEntry()?.value?.packageName
            }
        } else {
            val am = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
            @Suppress("DEPRECATION") //The deprecated method is used for devices running an API lower than LOLLIPOP
            currentApp = am.getRunningTasks(1)[0].topActivity.packageName
        }
        Log.e("ActivityTAG", "Application in foreground: " + currentApp)
        return currentApp
    }

Убедитесь, что у вашего приложения есть необходимые разрешения для доступа к статистике использования:

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

И чтобы пользователь предоставил надлежащее разрешение, вы можете перевести его на соответствующий экран настроек, чтобы активировать разрешение (при настройке приложения):

startActivity(new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS));

И еще одна вещь, всегда убедитесь, что вы ищете любой аналогичный вопрос , прежде чем публиковать новый.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...