2

UsageStatsManagerから照会しようとしています。毎日使用していたすべてのアプリパッケージを返すことを目的としています。Android:UsageStatsManagerが正しい日常の結果を返さない

コード:

public static List<UsageStats> getUsageStatsList(Context context){ 
    UsageStatsManager usm = getUsageStatsManager(context); 
    Calendar calendar = Calendar.getInstance(); 
    long endTime = calendar.getTimeInMillis(); 
    calendar.add(Calendar.DAY_OF_YEAR, -1); 
    long startTime = calendar.getTimeInMillis(); 

    List<UsageStats> usageStatsList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY,startTime, endTime); 
    return usageStatsList; 
} 

私はちょうど真夜中とクエリのusagestats前に毎日発射した後、返されたデータを格納するアラームを持っています。最初はすべてうまくいっているようでしたが、パッケージ結果とアクティブ時間を取得していましたが、時間ごとに結果を確認する関数を追加しました。ここでは奇妙な発見をしました。

UsageStatsManagerの結果は、真夜中ではなく、異なる時刻にリセットされているように見えました。これは、私がINTERVAL_DAILYを検索パラメータとして使用していると考えていると思われます。 ミッドナイト

  • 午前3時
  • 正午
  • 15:00
  • :私はパッケージ '時間' の結果を保存したデータから、

    は(ラフタイミング)でリセットされているように見えます

    私は、パッケージタイミングがリセットされたときと、起こることを意味する?

    私はすでに次のスレッドを見てきましたし、私からの私の多くの情報を得たところ、それはです:したがって How to use UsageStatsManager?

    :コメントで Android UsageStatsManager producing wrong output?queryUsageStatsから返されたデータが信頼できないことを言及ランダムな結果が返されます。

    シンプルなものがありませんか、またはUsageStatsManagerが正しく機能していませんか?

答えて

1

私はあまりにもAPI21でこの現象に気付きました。UsageStatsデータはAPI21で十分に長く維持されていません。API22からうまく機能します。android /data/system/usagestatsをチェックすると、API 21の制限されたエントリが見つかる信頼性の高いAPI UsageStatsManager APIに従ってINTERVAL_DAILYを照会しながら、あなたは一日usagestatsを取得します API 21+ 21.

、それを使用。 時間内にクエリを実行する場合は、queryEventsを使用し、独自のロジックで反復処理する必要があります。

私は次のように試しました...

これは、すべてのアプリケーションのためのデータを取得するためのモーダルクラスである:ここ

private class AppUsageInfo { 
     Drawable appIcon; 
     String appName, packageName; 
     long timeInForeground; 
     int launchCount; 

     AppUsageInfo(String pName) { 
      this.packageName=pName; 
     } 
} 

List<AppUsageInfo> smallInfoList; //global var

は方法、その簡単で、流れに行く:

void getUsageStatistics() { 

UsageEvents.Event currentEvent; 
List<UsageEvents.Event> allEvents = new ArrayList<>(); 
HashMap<String, AppUsageInfo> map = new HashMap <String, AppUsageInfo>(); 

long currTime = System.currentTimeMillis(); 
long startTime currTime - 1000*3600*3; //querying past three hours 

UsageStatsManager mUsageStatsManager = (UsageStatsManager) 
        mContext.getSystemService(Context.USAGE_STATS_SERVICE); 

     assert mUsageStatsManager != null; 
UsageEvents usageEvents = mUsageStatsManager.queryEvents(usageQueryTodayBeginTime, currTime); 

//capturing all events in a array to compare with next element 

     while (usageEvents.hasNextEvent()) { 
      currentEvent = new UsageEvents.Event(); 
      usageEvents.getNextEvent(currentEvent); 
      if (currentEvent.getEventType() == UsageEvents.Event.MOVE_TO_FOREGROUND || 
        currentEvent.getEventType() == UsageEvents.Event.MOVE_TO_BACKGROUND) { 
       allEvents.add(currentEvent); 
       String key = currentEvent.getPackageName(); 
// taking it into a collection to access by package name 
       if (map.get(key)==null) 
        map.put(key,new AppUsageInfo(key)); 
      } 
     } 

//iterating through the arraylist 
     for (int i=0;i<allEvents.size()-1;i++){ 
      UsageEvents.Event E0=allEvents.get(i); 
      UsageEvents.Event E1=allEvents.get(i+1); 

//for launchCount of apps in time range 
      if (!E0.getPackageName().equals(E1.getPackageName()) && E1.getEventType()==1){ 
// if true, E1 (launch event of an app) app launched 
       map.get(E1.getPackageName()).launchCount++; 
      } 

//for UsageTime of apps in time range 
      if (E0.getEventType()==1 && E1.getEventType()==2 
        && E0.getClassName().equals(E1.getClassName())){ 
       long diff = E1.getTimeStamp()-E0.getTimeStamp(); 
       phoneUsageToday+=diff; //gloabl Long var for total usagetime in the timerange 
       map.get(E0.getPackageName()).timeInForeground+= diff; 
      } 
     } 
//transferred final data into modal class object 
     smallInfoList = new ArrayList<>(map.values()); 

} 
1

私は推測します私はそこで起こっていることを発見した。私は(「パッケージ名」、2017年2月8日00.00.00、2017年3月8日00.00.00を送信したときに最初に私は

(今日の日付が2017年8月3日午後12時25分14秒である)、コードの下に書き、 );方法(私はカレンダーでこの日付を送った、あなたは、そのような日付を設定するには、Googleで検索することができます) 私はこの入力を得た;

46-'apppackagename'-9m 31s 
    154-'apppackagename'-22m 38s 

はその後、私は( "パッケージ名"、2017年8月3日00.00.00、2017年4月8日00.00.00)を送信し、方法、 私はこの入力を得ました。

25-'apppackagename'-22m 38s 

そして、私は約1分の方法で送ったアプリを使用しました。再び私は、メソッドの出力を送信されます。

02:08:2017-03.08.2017

46-'apppackagename'-9m 31s 
    154-'apppackagename'-23m 32s 

03:08:2017-04.08.2017

25-'apppackagename'-23m 32s 

あなたは、彼らは両方の増加ご覧のよう。私が03:00まで待っているのを見た後、 私は約5分のアプリを使い、私はこれらの出力を得ました。

02:08:2017-03.08.2017

46-'apppackagename'-9m 31s 
    154-'apppackagename'-23m 32s 

03:08:2017-04.08.2017

25-'apppackagename'-23m 32s 
    50-'apppackagename'-4m 48s 

締結すること、あなたはその日、その最後のforegroundrunningtime前に制御する必要があります。その日の最初の前景時間と同じです。あなたはその時間を排除し、他のものの合計を返すべきです。 (私はその奇妙なシステムを知らない場合でも。)03:00以降に始まる新しい日のカウンター。

私はそれがあなたに役立つことを願っています。

関連する問題