AndroidTV: UsageStatsManager не возвращает сведения о результатах приложений после перезагрузки

Я работаю над приложением Android TV (системным приложением), где пытаюсь использовать UsageStatsManager для получения списка недавно использованных приложений.
Следуя подходу,

UsageStatsManager usm = getUsageStatsManager(context);
Calendar calendar = Calendar.getInstance();
long endTime = calendar.getTimeInMillis();
calendar.add(Calendar.YEAR, -1)
final List<UsageStats> usageStatsList = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY, startTime, endTime);

Приведенный выше подход дает правильные данные об использовании, но после перезагрузки устройства он не будет предоставлять ранее использованные данные об использовании приложения, пока это приложение не будет открыто снова после перезагрузки.

Но тот же код отлично работает (после перезагрузки) на телефоне Android.

Я также попробовал этот пример приложения из Github на Android TV, который также не дает подробностей после перезагрузки. в Android TV (но работает в Mobile, обе версии ОС 8).

По какой причине не удается получить данные об использовании приложения для Android TV?

ТИА


person Anirban    schedule 01.01.2019    source источник
comment
вы нашли какое-нибудь решение?   -  person Nainal    schedule 24.01.2019
comment
Похоже, это ошибка в Android TV. Я проверил корневую коробку Android TV по пути «/data/system/usagestats/0/. Перед перезагрузкой я могу увидеть время последнего использования в записи статистики ежедневного использования. Но после выключения питания в той же папке я больше не вижу данные ранее использовавшегося приложения. Даже я проверял еженедельные, ежемесячные и годовые данные, но результат тот же.   -  person Anirban    schedule 08.05.2019


Ответы (1)


@Nainal вот обходной путь.

Как мы убедились, после выключения и включения устройства Android Tv box не возвращает статистику использования установленного приложения. Вот обходной путь, которому я следовал.

  • Мы извлекаем информацию об установленном приложении, а затем сохраняем только время последнего использования в хэш-карте.
  • И мы использовали пользовательский компаратор для сравнения по времени последнего использования и сортировки нашего списка сведений об установленных приложениях (ResolveInfo) для списка недавно использованных приложений.
  • Теперь, чтобы преодолеть ситуацию со сценарием цикла питания устройства, мы поддерживаем хеш-карту локально в приложении. Где мы будем хранить время последнего использования установленного приложения в виде длинных миллисекунд (эпоха). lastTimeUsedMap = новая HashMap(); И мы обновляем карту каждый раз, когда получаем новые данные от UsageStatsManager.
  • Мы упрощаем объект карты и сохраняем его как строку в общих настройках.

  • И после перезагрузки сначала мы найдем в статистике использования, имеет ли установленный пакет отметку времени или нет. Если нет, мы получим время из сохраненной карты.

Вот код:

private void SortByRecentlyUsed(final List<ResolveInfo> info, final Context context){

    /*load LastTimeUsedMap from pref*/
    lastTimeUsedMap = loadLastTimeUsedMap(context);

    UsageStatsManager usm = getUsageStatsManager(context);
    Calendar calendar = Calendar.getInstance();
    long endTime = calendar.getTimeInMillis();
    calendar.add(Calendar.MONTH, -1);
    long startTime = calendar.getTimeInMillis();

    final List<UsageStats> usageStatsList = usm.queryUsageStats(UsageStatsManager.INTERVAL_BEST, startTime, endTime);

    /*Update AppRecentTimeUsedMap with latest data from UsageStatsManager*/
    updateAppRecentTimeUsedMap(usageStatsList,info);

    class RecentUseComparator implements Comparator<ResolveInfo> {
        @Override
        public int compare(ResolveInfo lhs, ResolveInfo rhs) {
            String lhsPackageName=lhs.activityInfo.applicationInfo.packageName;
            String rhsPackageName=rhs.activityInfo.applicationInfo.packageName;
            long lhsUsedTime = getLastUsedTime(lhsPackageName);
            long rhsUsedTime = getLastUsedTime(rhsPackageName);
            return (lhsUsedTime > rhsUsedTime) ? -1 : (lhsUsedTime == rhsUsedTime) ? 0 : 1;
        }

        private long getLastUsedTime(String packageDetails) {
            long appRecentUsedtime = -1;
            if (appRecentTimeUsedMap.containsKey(packageDetails)) {
                appRecentUsedtime = appRecentTimeUsedMap.get(packageDetails);
                }
            return appRecentUsedtime;
        }
    }
    RecentUseComparator mRecentComp = new RecentUseComparator();
    Collections.sort(info, mRecentComp);
    /*Save the updated  LastTimeUsedMap in pref*/
    saveLastTimeUsedMap(lastTimeUsedMap, context);

}

private void updateAppRecentTimeUsedMap(List<UsageStats> usageStatsList,List<ResolveInfo> info){

    String packageName=null;
    if (usageStatsList != null) {
        for (ResolveInfo Rinfo : info) {
            packageName = Rinfo.activityInfo.applicationInfo.packageName;
            boolean added = false;
            for (UsageStats usageStats : usageStatsList) {
                if (packageName.equalsIgnoreCase(usageStats.getPackageName())) {
                    appRecentTimeUsedMap.put(usageStats.getPackageName(), usageStats.getLastTimeUsed());
                    updateLastTimeUsedMap(usageStats.getPackageName(), usageStats.getLastTimeUsed());
                    added=true;
                }
            }
            if (!added && lastTimeUsedMap.containsKey(packageName)) {
                appRecentTimeUsedMap.put(packageName, lastTimeUsedMap.get(packageName));
            }
        }

    }

}

private void updateLastTimeUsedMap(String packageName,Long timeStamp){
    lastTimeUsedMap.put(packageName, timeStamp);
}

/**
 * Return Map containing Package name and recent used time from preference
 *
 * @param context
 * @return Map<String,Long>
 */
private Map<String,Long> loadLastTimeUsedMap(Context context){
    Map<String,Long> outputMap = new HashMap<String,Long>();
    SharedPreferences pSharedPref = context.getSharedPreferences(LAST_TIME_USED_PREFS, Context.MODE_PRIVATE);
    try{
        if (pSharedPref != null){
            String jsonString = pSharedPref.getString(LAST_TIME_USED_MAP, (new JSONObject()).toString());
            JSONObject jsonObject = new JSONObject(jsonString);
            Iterator<String> keysItr = jsonObject.keys();
            while(keysItr.hasNext()) {
                String key = keysItr.next();
                Long value = jsonObject.getLong(key);
                outputMap.put(key, value);
            }
        }
    }catch(Exception e){
        e.printStackTrace();
    }
    return outputMap;
}
/**
 * Save the updated map containing Package name and recent used time in preference
 *
 * @param inputMap
 * @param context
 */
private void saveLastTimeUsedMap(Map<String,Long> inputMap, Context context){
    final SharedPreferences sharedPreferences = context.getSharedPreferences(LAST_TIME_USED_PREFS,Context.MODE_PRIVATE);
    if (sharedPreferences != null){
        JSONObject jsonObject = new JSONObject(inputMap);
        String jsonString = jsonObject.toString();
        final SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.remove(LAST_TIME_USED_MAP).commit();
        editor.putString(LAST_TIME_USED_MAP, jsonString);
        editor.commit();
    }
}
person Anirban    schedule 08.05.2019