android - usagestatsmanager github




如何使用UsageStatsManager? (4)

你可以這樣做

//noinspection ResourceType
final UsageStatsManager usageStatsManager=(UsageStatsManager)context.getSystemService("usagestats");// Context.USAGE_STATS_SERVICE);
final int currentYear=Calendar.getInstance().get(Calendar.YEAR);
final List<UsageStats> queryUsageStats=usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY,currentYear-2,currentYear);

背景

Google已棄用“ActivityManager”類的“ getRecentTasks ”函數。 現在它所做的只是獲取當前應用程序已打開的應用程序列表。

我甚至在StackOverflow上寫了一篇關於它的帖子,但我發現這是不可能的。

問題

我發了一篇關於它的帖子( here ,另一個,類似的由其他人創建, here ),並要求重新考慮它,谷歌決定創建一個新類,似乎提供類似的功能(更像是統計,但也可能有用),但我無法找到如何使用它。

該類被稱為“ UsageStatsManager ”,我的猜測是函數“ queryUsageStats ”完成了這項工作。

此外,它似乎有一個新的權限(“ android.permission.PACKAGE_USAGE_STATS ”),這是一個系統權限 ,但它寫道:

聲明權限意味著使用API​​的意圖,設備用戶可以通過Settings應用程序授予權限。

Here's關於這個新功能Here's另一個鏈接。

我發現了什麼

我查看了Android的代碼,並註意到“Context”有USAGE_STATS_SERVICE,在JavaDocs中說下一件事:

/**
 * Use with {@link #getSystemService} to retrieve a {@link
 * android.app.UsageStatsManager} for interacting with the status bar.
 *
 * @see #getSystemService
 * @see android.app.UsageStatsManager
 * @hide
 */
public static final String USAGE_STATS_SERVICE = "usagestats";

奇怪的是,不僅它說“ status bar ”,而且packageName也不匹配(應該是“ android.app.usage.UsageStatsManager ”)。

我還添加了正確的權限:

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

這是我使用的代碼:

  final UsageStatsManager usageStatsManager=(UsageStatsManager)context.getSystemService("usagestats");// Context.USAGE_STATS_SERVICE);
  final int currentYear=Calendar.getInstance().get(Calendar.YEAR);
  final List<UsageStats> queryUsageStats=usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY,currentYear-2,currentYear);

在模擬器本身,我進入“ Settings"->"security"->"apps with usage access ”,並啟用了我的應用程序。

但是,在運行代碼時,我得到的只是一個空列表...

這個問題

你如何使用UsageStatsManager

另外,如何讓用戶以最簡單的方式授予權限? 或者,只要應用程序嘗試獲取所需信息,它是否會自動完成?

嘗試使用此類但用戶尚未確認時會發生什麼?

如何讓代碼返回真正的應用程序列表?


回答你的上一個問題“如何讓代碼返回真正的應用程序列表?”。 queryUsageStats採用開始時間和結束時間(以毫秒為單位),而不是int中年份的值。

Calendar beginCal = Calendar.getInstance();
beginCal.set(Calendar.DATE, 1);
beginCal.set(Calendar.MONTH, 0);
beginCal.set(Calendar.YEAR, 2012);

Calendar endCal = Calendar.getInstance();
endCal.set(Calendar.DATE, 1);
endCal.set(Calendar.MONTH, 0);
endCal.set(Calendar.YEAR, 2014);

final List<UsageStats> queryUsageStats=usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY, beginCal.getTimeInMillis(), endCal.getTimeInMillis());

這應返回2012和2013年的UsageStats列表(請記住,結束時間不包括最終結果時間範圍)。



我認為文檔只是日曆內容的簡寫。 我不認為它實際上只適用於2014年; 但是我錯了。

要訪問UsageStats的實際列表,您需要創建具有正確月,日和年的Calendar對象。 正如MRK在另一個答案中所說的那樣。 我複制並更正了MRK代碼中的錯誤,以便將來看到它的人都可以看到它。

Calendar beginCal = Calendar.getInstance();
beginCal.set(Calendar.DATE, 1);
beginCal.set(Calendar.MONTH, 0);
beginCal.set(Calendar.YEAR, 2012);

Calendar endCal = Calendar.getInstance();
endCal.set(Calendar.DATE, 1);
endCal.set(Calendar.MONTH, 0);
endCal.set(Calendar.YEAR, 2014);

final List<UsageStats> queryUsageStats=usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY, beginCal.getTimeInMillis(), endCal.getTimeInMillis());

-Credit MRK; 由我糾正(他偶然只是把cal而不是beginCal和endCal)

使用訪問設置的代碼如下。 :)

Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
startActivity(intent);






usagestatsmanager