欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android使用記錄訪問權(quán)限詳解

 更新時間:2017年02月23日 11:06:02   作者:Othershe  
這篇文章主要介紹了Android使用記錄訪問權(quán)限的相關(guān)資料,文中介紹的很詳細,對大家具有一定的參考借鑒價值,需要的朋友們下面來一起看看吧。

使用記錄訪問權(quán)限

什么是使用記錄訪問權(quán)限呢?這是在Android5.0(Api level 21)新添加的,通過該權(quán)限我們可以查看設(shè)備上其它應(yīng)用使用情況的統(tǒng)計信息等。

如何使用該權(quán)限呢?

首先在manifest中添加:

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

由于該權(quán)限默認只授予系統(tǒng)應(yīng)用,所以添加了ignore屬性。

然后通過如下代碼進而手動打開權(quán)限:

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

當(dāng)然只要我們在manifest中進行了權(quán)限配置,也可以通過設(shè)置->安全->有權(quán)查看使用情況的應(yīng)用來打開權(quán)限:

到此我們的應(yīng)用就擁有了該權(quán)限。那么有了這個權(quán)限到底能做什么呢?繼續(xù)往下看......

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

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

public final class UsageStatsManager {
 public static final int INTERVAL_BEST = 4; //根據(jù)提供的開始、結(jié)束時間決定時間間隔
 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!");
 }
}

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

我們實現(xiàn)思路是這樣的,通過UsageStatsManager類獲得2秒內(nèi)手機app的使用數(shù)據(jù),找到時間最近的一個,如果不是我們自己的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對象對應(yīng)一個查詢到的app數(shù)據(jù),主要包含以下信息:

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

@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);
 }

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

類似的道理,我們也可以判斷摸個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的包名集合(其中包括系統(tǒng)級別的):


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

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

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

總結(jié)

先到這里吧,以上就是這篇文章的全部內(nèi)容了,更多的用法還有待進一步探究。希望這篇文章對各位Android開發(fā)者們能帶來一定的幫助,謝謝大家對腳本之家能帶來一定的幫助。

demo下載

相關(guān)文章

  • Android編程實現(xiàn)設(shè)置按鈕背景透明與半透明及圖片背景透明的方法

    Android編程實現(xiàn)設(shè)置按鈕背景透明與半透明及圖片背景透明的方法

    這篇文章主要介紹了Android編程實現(xiàn)設(shè)置按鈕背景透明與半透明及圖片背景透明的方法,結(jié)合實例形式較為詳細的分析了Button及ImageButton的背景屬性設(shè)置技巧,非常簡單實用,需要的朋友可以參考下
    2015-12-12
  • Android控件之ProgressBar用法實例分析

    Android控件之ProgressBar用法實例分析

    這篇文章主要介紹了Android控件之ProgressBar用法,以一個完整實例形式較為詳細的分析了ProgressBar控件操作進度顯示的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09
  • Android View轉(zhuǎn)換為Bitmap實現(xiàn)應(yīng)用內(nèi)截屏功能

    Android View轉(zhuǎn)換為Bitmap實現(xiàn)應(yīng)用內(nèi)截屏功能

    這篇文章主要介紹了Android View轉(zhuǎn)換為Bitmap實現(xiàn)應(yīng)用內(nèi)截屏功能,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-09-09
  • 在Ubuntu下搭建Android開發(fā)環(huán)境

    在Ubuntu下搭建Android開發(fā)環(huán)境

    對一個程序猿來說,裝好系統(tǒng)之后的第一件事,一定是搭建開發(fā)環(huán)境,已經(jīng)安裝各種開發(fā)工具,以便之后能方便順利地進行程序的開發(fā)。簡單的介紹下在Ubuntu環(huán)境下搭建Android開發(fā)環(huán)境,雖然基本上和在Windows下沒有太大差別,但有些細節(jié)上還是很值得注意的。
    2014-07-07
  • Android 實現(xiàn)搶購倒計時功能的示例

    Android 實現(xiàn)搶購倒計時功能的示例

    這篇文章主要介紹了Android 實現(xiàn)搶購倒計時功能的示例,幫助大家更好的理解和學(xué)習(xí)使用Android開發(fā),感興趣的朋友可以了解下
    2021-03-03
  • 詳解android與百度echarts項目整合方法

    詳解android與百度echarts項目整合方法

    在本篇文章里我們給大家分享了關(guān)于android與百度echarts項目整合方法和具體步驟,需要的朋友們跟著學(xué)習(xí)下。
    2019-03-03
  • Android Activity 入門簡介

    Android Activity 入門簡介

    Activity 是一個應(yīng)用組件,用戶可與其提供的屏幕進行交互,以執(zhí)行撥打電話、拍攝照片、發(fā)送電子郵件或查看地圖等操作,這篇文章主要介紹了Android Activity入門基礎(chǔ)知識,需要的朋友可以參考下
    2024-04-04
  • android使用datepicker計算年齡

    android使用datepicker計算年齡

    這篇文章主要為大家詳細介紹了android使用datepicker計算年齡,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • 解析如何在android中增加gsensor驅(qū)動(MMA7660)

    解析如何在android中增加gsensor驅(qū)動(MMA7660)

    本篇文章是對在android中增加gsensor驅(qū)動(MMA7660)進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • Android studio保存logcat日志到本地的操作

    Android studio保存logcat日志到本地的操作

    這篇文章主要介紹了Android studio保存logcat日志到本地的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04

最新評論