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?
ТИА
0 ответов
@Nainal - это обходной путь.
Как мы уже убедились, после перезапуска устройства Android TV Box не возвращает статистику использования установленного приложения. Вот обходной путь, которым я следовал.
- Мы извлекаем информацию об установленном приложении, а затем сохраняем время последнего использования на карте хеширования.
- И мы использовали настраиваемый компаратор для сравнения с последним использованным временем и сортировки нашего списка сведений об установленных приложениях (ResolveInfo) для списка недавно использованных приложений.
- Теперь, чтобы преодолеть ситуацию со сценарием цикла включения питания устройства, мы поддерживаем хеш-карту локально в приложении. Где мы будем хранить время последнего использования установленного приложения как Long millis (epoch) . 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();
}
}