現在実行中または開いているアンドロイドアプリケーションのリストを取得する方法はないので、デバイスで実行中の最後のアプリケーションを見つけることができます。ありがとうAndroid:現在開いているアプリケーションのスタック(配列)を取得
1
A
答えて
1
私は、数日から絵文字キーボードを操作していました。画像を送信したいときはいつも、intentchooser
をポップアップして、画像をエキストラとして扱うことができるアプリケーションを1つ選択するように、フォアグラウンドのアプリケーションパッケージ名を取得するのに3日かかります。
Googleが現在実行中のアプリケーションを取得するために使用されたgetRunningTasks()
メソッドを廃止したため、すべてのチュートリアルとリンクが機能しません。
次に、ResolveInfo
を使用してデバイス上で現在実行中のアプリケーションのスタックを取得するという素晴らしいアイデアがありましたが、うまくいきませんでした。
私はUsageStatsManager
という名前のAPI 21で導入された新しいクラスを手に入れました。 This github linkは、このクラスを使用して実行中のアプリケーションpackagenameを取得する方法を提供します。
ArrayList<String> sortedApplication = UStats.printCurrentUsageStatus(SimpleIME.this);
Log.d("TAG", "applicationList: " + sortedApplication.toString());
:以下のコードを使用して、
public class UStats {
public static final String TAG = UStats.class.getSimpleName();
@SuppressLint("SimpleDateFormat")
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("M-d-yyyy HH:mm:ss");
public static ArrayList<String> printCurrentUsageStatus(Context context) {
return printUsageStats(getUsageStatsList(context));
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public static ArrayList<String> printUsageStats(List<UsageStats> usageStatsList) {
HashMap<String, Integer> lastApp = new HashMap<String, Integer>();
for (UsageStats u : usageStatsList) {
lastApp.put(u.getPackageName(), (int) u.getLastTimeStamp());
/*Log.d(TAG, "Pkg: " + u.getPackageName() + "\t" + "ForegroundTime: "
+ u.getTotalTimeInForeground() + "\t" + "LastTimeStamp: " + new Date(u.getLastTimeStamp()));*/
}
Map<String, Integer> sortedMapAsc = sortByComparator(lastApp);
ArrayList<String> firstApp = new ArrayList<>();
for (Map.Entry<String, Integer> entry : sortedMapAsc.entrySet()) {
String key = entry.getKey();
//Integer value = entry.getValue();
firstApp.add(key);
/*System.out.println("package name: " + key + ", time " + new Date(Math.abs(value)));*/
}
return firstApp;
}
// To check the USAGE_STATS_SERVICE permission
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public static List<UsageStats> getUsageStatsList(Context context) {
UsageStatsManager usm = getUsageStatsManager(context);
Calendar calendar = Calendar.getInstance();
long endTime = calendar.getTimeInMillis();
calendar.add(Calendar.MINUTE, -1);
long startTime = calendar.getTimeInMillis();
Log.d(TAG, "Under getUsageStateList");
Log.d(TAG, "Range start:" + dateFormat.format(startTime));
Log.d(TAG, "Range end:" + dateFormat.format(endTime));
List<UsageStats> usageStatsList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, startTime, endTime);
return usageStatsList;
}
// Sort the map in the ascending order of the timeStamp
private static Map<String, Integer> sortByComparator(Map<String, Integer> unsortMap) {
List<Map.Entry<String, Integer>> list = new LinkedList<>(unsortMap.entrySet());
// Sorting the list based on values
Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
public int compare(Map.Entry<String, Integer> o1,
Map.Entry<String, Integer> o2) {
return o2.getValue().compareTo(o1.getValue());
}
});
// Maintaining insertion order with the help of LinkedList
Map<String, Integer> sortedMap = new LinkedHashMap<String, Integer>();
for (Map.Entry<String, Integer> entry : list) {
sortedMap.put(entry.getKey(), entry.getValue());
}
return sortedMap;
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP_MR1)
@SuppressWarnings("ResourceType")
private static UsageStatsManager getUsageStatsManager(Context context) {
UsageStatsManager usm = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
return usm;
}
}
は、その後、私は単にアプリケーションのパッケージ名のArrayListのを取得:
以下は、私が上で動作するパッケージ名のアプリケーションを得た方法私のコードです
許可を忘れた場合:
<uses-permission android:name = "android.permission.PACKAGE_USAGE_STATS"
tools:ignore = "ProtectedPermissions"/>
以下のコードを確認してください我々のアプリケーションは、他のアプリケーションのステータスを取得する権限を持っています
if (UStats.getUsageStatsList(this).isEmpty()) {
Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
Toast.makeText(MainActivity.this, "Enable Usage Access for YOUR_APP_NAME to use this app", Toast.LENGTH_LONG).show();
startActivity(intent);
}
上記のコードは、(一回用)、他のアプリケーションの使用状況の統計情報を取得するために私たちのアプリケーションを可能にするために、アクセス設定ページを開きます。
希望すると、これが役立ちます。
関連する問題
- 1. コマンドラインから現在開いているアプリケーションを取得
- 2. Androidアプリケーションで現在のアクティビティを取得
- 3. IntelliJ Plugin現在開いているファイルからコードを取得
- 4. VSCodeで現在開いているファイルを取得
- 5. android youtube player現在のフレームを取得
- 6. Androidは現在の位置を取得
- 7. 現在のアイテムを取得ViewPageAdapter Android
- 8. madExcept、現在のスタックの先頭を取得
- 9. 現在開いているエディタで特定の文字列の位置を取得する方法は?
- 10. C#を使用してスタック内の現在のインデックスを取得する方法
- 11. 現在アクティブなアプリケーション名を取得
- 12. JMX..get現在展開されているアプリケーション名を
- 13. 取得現在mvc3アプリケーションを表示している接続の数
- 14. Androidのナビゲーションドロワーの現在選択されているアイテムを取得
- 15. JavaFXで現在開かれているステージを取得する方法は?
- 16. 現在ログインしているユーザ名/ユーザIDをUWPアプリケーションで取得する
- 17. は、私が現在アプリケーションを開発していEclipseの
- 18. VBA WSツールキット、現在のファイルをバイト配列として取得する方法
- 19. 現在の画像を取得してAndroidで共有する
- 20. Javaアプリケーションで現在開いているファイルの数を調べる方法は?
- 21. Railsアプリケーション内の現在のGitコミットバージョンを取得していますか?
- 22. 現在のModelView行列の取得
- 23. 現在開いているdiv内のdivを開く
- 24. 現在ログインしているFBユーザーのIDを取得する
- 25. ログインしている現在のユーザーのデータを取得
- 26. 現在のアプリケーションで開かれているフラグメントの名前をAndroidサービスから取得するにはどうすればよいですか?
- 27. 電話機の現在地を取得していませんか? [Android]
- 28. Android、RxJavaを使用して現在のアクティビティを取得
- 29. fopenで開いたファイルの現在の行を取得するには?
- 30. NetBeansで現在開いているプロジェクトのファイルパスを取得する正しい方法