web-dev-qa-db-ja.com

UsageStatsManagerの使用方法

バックグラウンド

Googleは、「ActivityManager」クラスの関数「 getRecentTasks 」を廃止しました。現在は、現在のアプリが開いているアプリのリストを取得するだけです。

私はそれについての投稿さえ書いた ここStackOverflowについて が、不可能だと気づいた。

問題

私はそれについて投稿しました( here 、および他の誰かが作成した同様の別の投稿 here )そしてそれを再検討するように要求され、Googleは同様の機能を提供するように見える新しいクラスを作成することにしました(統計に似ていますが、役に立つかもしれません)使い方はわかりません。

クラスは「UsageStatsManager」と呼ばれ、私の推測では、関数「 queryUsageStats 」が仕事をする。

また、新しいパーミッション( "Android.permission.PACKAGE_USAGE_STATS")があるようです。これはシステムパーミッションですが、次のように書かれています:

許可を宣言することは、APIを使用する意図を意味し、デバイスのユーザーは設定アプリケーションを介して許可を付与できます。

Here's この新しい機能に関する別のリンク。

私が見つけたもの

私はAndroidのコードを見て、「コンテキスト」に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はどのように使用しますか?

また、可能な限り簡単な方法でユーザーに許可を許可するにはどうすればよいですか?または、アプリが必要な情報を取得しようとすると、自動的に行われますか?

このクラスを使用しようとして、ユーザーがまだ確認していない場合はどうなりますか?

コードがアプリの実際のリストを返すようにするにはどうすればよいですか?

52

このドキュメントは、Calendarの略語にすぎないと思います。実際には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());

-クレジットMRK;私によって修正されました(彼は誤ってbeginCalとendCalの代わりにcalを入れました)

使用アクセス設定のコードは次のとおりです。 :)

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

GithubでUsageStatsを使用する方法のサンプルを作成しました。うまくいけば誰かの助けになる

https://github.com/ColeMurray/UsageStatsSample

21
Cole Murray

最後の質問「コードでアプリの実際のリストが返されるようにするにはどうすればよいですか?」 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のリストが返されます(終了時刻は最終結果の時間範囲を除外することに注意してください)。

8
MRK

UseStatsを使用すると、ユーザーが通知ドロワーを開いたとき、またはロックされた画面で間違った情報を取得します。 UsageStatsManager.queryEvents()を使用し、MOVE_TO_FOREGROUNDイベントタイプで最新のイベントを探す必要があります。

3
Sam Lu

実際には AOSPサンプルコードに含まれるサンプルアプリ :_developers/samples/Android/system/AppUsageStatistics/_

アプリでUsageStatsを使用するために必要なすべてのビットが含まれています。

  1. _AndroidManifest.xml_で許可を宣言する

    _<uses-permission Android:name="Android.permission.PACKAGE_USAGE_STATS"/>_

  2. UsageStatsManagerへのアクセス許可を付与する設定を表示

    startActivity(new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS));

  3. 統計情報のクエリUsageStatsManager

    _Calendar cal = Calendar.getInstance();
    cal.add(Calendar.YEAR, -1);
    List<UsageStats> queryUsageStats = mUsageStatsManager
            .queryUsageStats(intervalType, cal.getTimeInMillis(),
                    System.currentTimeMillis());
    _
  4. UsageStatsに基づいてアプリのリストを作成する

例をまとめて適用するには:

  • 使用状況の統計にアクセスするための許可を正しく求めて許可しているようです。
  • UsageStatsシステムサービスを正しく取得します。
  • ただし、クエリする期間は短くする方法です。引数beginTimeおよびendTimeは、エポック以降のミリ秒単位で測定されます。 Calendarインスタンスは、getTimeinMillis()でこの値を提供できます。あなたが間違ってしているのは、年の番号(今日プログラムを実行する場合は_2015_ and _2017_)だけを与えることです。これらの値はエポック以降のミリ秒として解釈されるため、間隔は2ミリ秒のみで、1970年のある時間です。

投稿した次のコードスニペットの代わりに、以下に投稿した例をコピーする必要があります。

間違っている:

_final int currentYear=Calendar.getInstance().get(Calendar.YEAR);
final List<UsageStats> queryUsageStats=usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY,currentYear-2,currentYear);
_

正解:

_final long currentTime = System.currentTimeMillis(); // Get current time in milliseconds

final Calendar cal = Calendar.getInstance();
cal.add(Calendar.YEAR, -2); // Set year to beginning of desired period.
final long beginTime = cal.getTimeInMillis(); // Get begin time in milliseconds

final List<UsageStats> queryUsageStats=usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY, beginTime, currentTime);
_
2
justfortherec

特定の期間の使用統計を表示する場合。エポック以降、期間の開始と終了のミリ秒単位で時間の長さを最初に計算する必要があります。 (Epochは1970年1月1日木曜日00:00:00 UTCから経過した秒数です。)または、次のサンプルコードで示すように、簡単な方法はミリ秒単位で現在時刻から逆算することです。

たとえば、過去4日間の統計情報が必要な場合は、次のようになります。

UsageStatsManager mUsageStatsManager = (UsageStatsManager) this.getSystemService(Context.USAGE_STATS_SERVICE);    
List<UsageStats> queryUsageStats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY,
                    (System.currentTimeMillis() - 345600000), System.currentTimeMillis());

345600000という数値は、4ミリ秒の量です。

INTERVAL_TYPEについては、 this で説明されています。

システムは、4つの異なる間隔でデータを収集および集約します。それらは、INTERVAL_DAILY、INTERVAL_WEEKLY、INTERVAL_MONTHLY、およびINTERVAL_YEARLYです。システムレコードは時間に制限があるため、毎日最大7日間、最大4週間、最大6か月、最終的には最大2年間、アプリの使用状況データを取得できます。 。言及する5番目のオプションがあります。INTERVAL_BESTは、選択した期間に基づいて、上記の4つの間の最適な間隔を選択します。

1
Msgun

あなたはこのようにすることができます

//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);
0