中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android開發中怎么使用記錄訪問權限

發布時間:2020-11-24 15:30:20 來源:億速云 閱讀:243 作者:Leah 欄目:移動開發

Android開發中怎么使用記錄訪問權限?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

什么是使用記錄訪問權限

這是在Android5.0(Api level 21)新添加的,通過該權限我們可以查看設備上其它應用使用情況的統計信息等。

如何使用該權限呢?

首先在manifest中添加:

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

由于該權限默認只授予系統應用,所以添加了ignore屬性。

然后通過如下代碼進而手動打開權限:

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

當然只要我們在manifest中進行了權限配置,也可以通過設置->安全->有權查看使用情況的應用來打開權限:

Android開發中怎么使用記錄訪問權限

到此我們的應用就擁有了該權限。那么有了這個權限到底能做什么呢?繼續往下看......

前段時間和同事聊到了一個叫我要當學霸的app,里邊有個學習監督的功能,就需要使用記錄訪問權限,當打開權限后,除了自己和桌面外,其它app都不能正常使用,點擊其它app時會直接退到后臺并彈出一個提示頁面。不妨我們來模擬下這個功能。

在這之前我們首先看一個類UsageStatsManager:

public final class UsageStatsManager {
 public static final int INTERVAL_BEST = 4; //根據提供的開始、結束時間決定時間間隔
 public static final int INTERVAL_DAILY = 0; //以天為時間間隔(最長7天)
 public static final int INTERVAL_MONTHLY = 2; //以月為時間間隔(最長6個月)
 public static final int INTERVAL_WEEKLY = 1; //以周為時間間隔(最長4個星期)
 public static final int INTERVAL_YEARLY = 3; //以年為時間間隔(最長2年)

 UsageStatsManager() {
 throw new RuntimeException("Stub!");
 }

 public List<UsageStats> queryUsageStats(int intervalType, long beginTime, long endTime) {
 throw new RuntimeException("Stub!");
 }

 public List<ConfigurationStats> queryConfigurations(int intervalType, long beginTime, long endTime) {
 throw new RuntimeException("Stub!");
 }

 public UsageEvents queryEvents(long beginTime, long endTime) {
 throw new RuntimeException("Stub!");
 }

 public Map<String, UsageStats> queryAndAggregateUsageStats(long beginTime, long endTime) {
 throw new RuntimeException("Stub!");
 }

 public boolean isAppInactive(String packageName) {
 throw new RuntimeException("Stub!");
 }
}

可以看到該類提供了五種時間間隔類型,這里我們比較關注queryUsageStats()方法,通過該方法我們可以得到一段時間內 其它應用的使用情況。

我們實現思路是這樣的,通過UsageStatsManager類獲得2秒內手機app的使用數據,找到時間最近的一個,如果不是我們自己的app或桌面則模擬home鍵點擊,同時彈出一個提示頁面,具體的代碼如下:

private void getTopApp() {
 UsageStatsManager mUsageStatsManager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);//usagestats
 long time = System.currentTimeMillis();
 List<UsageStats> usageStatsList = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_BEST, time - 2000, time);

 if (usageStatsList != null && !usageStatsList.isEmpty()) {
  SortedMap<Long, UsageStats> usageStatsMap = new TreeMap<>();
  for (UsageStats usageStats : usageStatsList) {
  usageStatsMap.put(usageStats.getLastTimeUsed(), usageStats);
  }
  if (!usageStatsMap.isEmpty()) {
  String topPackageName = usageStatsMap.get(usageStatsMap.lastKey()).getPackageName();

  if (getLauncherPackageName(mContext).equals(topPackageName) || "com.othershe.test".equals(topPackageName)) {
   return;
  }

  Log.e("TopPackage Name", topPackageName);

  //模擬home鍵點擊
  Intent intent = new Intent(Intent.ACTION_MAIN);
  intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  intent.addCategory(Intent.CATEGORY_HOME);
  startActivity(intent);

  //啟動提示頁面
  Intent intent1 = new Intent(mContext, TipActivity.class);
  intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  startActivity(intent1);
  }
 }
 }

因為時間周期是2秒,所以這里我們采用INTERVAL_BEST作為時間間隔。其中的UsageStats對象對應一個查詢到的app數據,主要包含以下信息:

Android開發中怎么使用記錄訪問權限

getTopApp()是我們的核心方法,當然我們需要開啟一個服務,然后在服務中每隔500毫秒執行一次上邊的方法,這樣就能起到不斷檢測的作用:

@Override
 public int onStartCommand(Intent intent, int flags, int startId) {

 mTimer = new Timer();
 TimerTask task = new TimerTask() {
  @Override
  public void run() {
  getTopApp();
  }
 };

 mTimer.schedule(task, 1000, 500);
 return super.onStartCommand(intent, flags, startId);
 }

打開權限、啟動服務,可以看到實際的運行效果如下,基本符合我們的預期。

Android開發中怎么使用記錄訪問權限

類似的道理,我們也可以判斷摸個app是否在前臺運行。

上邊我們使用了INTERVAL_BEST 時間間隔類型,還可以使用其它4中,例如使用INTERVAL_YEARLY:

private void getHistoryApps() {
 Calendar calendar = Calendar.getInstance();
 long endTime = calendar.getTimeInMillis();
 calendar.add(Calendar.YEAR, -1);
 long startTime = calendar.getTimeInMillis();

 UsageStatsManager mUsageStatsManager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
 List<UsageStats> usageStatsList = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY, startTime, endTime);

 if (usageStatsList != null && !usageStatsList.isEmpty()) {
  HashSet<String> set = new HashSet<>();
  for (UsageStats usageStats : usageStatsList) {
  set.add(usageStats.getPackageName());
  }

  if (!set.isEmpty()) {
  Log.e("size", set.size() + "");
  }
 }
 }

上邊的代碼我們最終獲得了過去一年手機上使用過的app的包名集合(其中包括系統級別的):

Android開發中怎么使用記錄訪問權限

拿到這些包名可以做什么呢?

其實對于網賺類型的應用有這樣一種業務場景,就是用戶通過下載app來做任務進而賺取收益,但是如果當前設備通過其它網賺應用已經下載過某個app,然后卸載了,再通過你的網賺應用下載。如果你不知道用戶之前安裝過該app,就需要給用戶結算相應的收益,但是你的上游渠道是不會給你結算的,因為這屬于同一設備上的重復下載,這樣對公司而言就是虧損的。

有了歷史包名信息,我們就可以判斷用戶在一定的時間周期內是否安裝過對應的app,進而采取相應的策略,這樣可以在一定程度降低損失。當然有個前提,你要友好的引導用戶開啟權限。

關于Android開發中怎么使用記錄訪問權限問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

黑河市| 长武县| 宜昌市| 大兴区| 大余县| 马尔康县| 轮台县| 福安市| 广东省| 石门县| 焦作市| 洛宁县| 郓城县| 东山县| 壶关县| 涞水县| 封开县| 万荣县| 拜城县| 无棣县| 灵台县| 淳安县| 安义县| 宁蒗| 石泉县| 莱西市| 兴义市| 济阳县| 南投市| 舟曲县| 富源县| 南涧| 内丘县| 定襄县| 清河县| 克东县| 潢川县| 义马市| 郓城县| 黑山县| 锦州市|