Android UsageStatsManager:获取手机上当前正在运行的应用程序列表
我正在尝试获取手机上当前正在运行的应用程序列表。以下是我正在使用的代码:Android UsageStatsManager:获取手机上当前正在运行的应用程序列表,android,android-permissions,usagestatsmanager,Android,Android Permissions,Usagestatsmanager,我正在尝试获取手机上当前正在运行的应用程序列表。以下是我正在使用的代码: if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { UsageStatsManager usm = (UsageStatsManager)this.getSystemService(Context.USAGE_STATS_SERVICE); long tim
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
UsageStatsManager usm = (UsageStatsManager)this.getSystemService(Context.USAGE_STATS_SERVICE);
long time = System.currentTimeMillis();
List<UsageStats> appList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 10000*10000, time);
if (appList != null && appList.size() == 0) {
Log.d("Executed app", "######### NO APP FOUND ##########" );
}
if (appList != null && appList.size() > 0) {
SortedMap<Long, UsageStats> mySortedMap = new TreeMap<Long, UsageStats>();
for (UsageStats usageStats : appList) {
Log.d("Executed app", "usage stats executed : " +usageStats.getPackageName() + "\t\t ID: ");
mySortedMap.put(usageStats.getLastTimeUsed(), usageStats);
}
if (mySortedMap != null && !mySortedMap.isEmpty()) {
String currentApp = mySortedMap.get(mySortedMap.lastKey()).getPackageName();
}
}
}
if(android.os.Build.VERSION.SDK\u INT>=android.os.Build.VERSION\u CODES.LOLLIPOP){
UsageStatsManager usm=(UsageStatsManager)this.getSystemService(Context.USAGE\u STATS\u SERVICE);
长时间=System.currentTimeMillis();
List appList=usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY,time-10000*10000,time);
if(appList!=null&&appList.size()=0){
Log.d(“已执行的应用程序”、“未找到应用程序”);
}
if(appList!=null&&appList.size()>0){
SortedMap mySortedMap=newtreemap();
for(UsageStats UsageStats:appList){
Log.d(“已执行的应用程序”,“已执行的使用情况统计数据:”+usageStats.getPackageName()+“\t\t ID:”);
mySortedMap.put(usageStats.getLastTimeUsed(),usageStats);
}
if(mySortedMap!=null&&!mySortedMap.isEmpty()){
字符串currentApp=mySortedMap.get(mySortedMap.lastKey()).getPackageName();
}
}
}
在这里,我也设置了权限:
<uses-permission
android:name="android.permission.PACKAGE_USAGE_STATS"
tools:ignore="ProtectedPermissions" />
它没有检测到任何应用程序使用情况。我在stackoverflow上尝试了其他一些方法,但似乎没有任何效果。我甚至在某个地方读到,新手机已经完全取消了应用程序监控手机上运行的其他应用程序的功能。非常感谢您的帮助 问题是您的应用程序没有android:get\u usage\u stats的系统权限 您可以使用以下代码检查您是否具有权限:
public static boolean needPermissionForBlocking(Context context){
try {
PackageManager packageManager = context.getPackageManager();
ApplicationInfo applicationInfo = packageManager.getApplicationInfo(context.getPackageName(), 0);
AppOpsManager appOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
int mode = appOpsManager.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, applicationInfo.uid, applicationInfo.packageName);
return (mode != AppOpsManager.MODE_ALLOWED);
} catch (PackageManager.NameNotFoundException e) {
return true;
}
}
如果您没有此权限,则用户必须通过转到设置->安全->具有使用权限的应用程序,然后添加您的应用程序来启用此权限。您的代码应该可以正常工作。您是否尝试过
ActivityManager am=(ActivityManager)getSystemService(Context.ACTIVITY\u SERVICE);List runningAppProcessInfo=am.getRunningAppProcesss()
然后运行appprocessinfo.get(i).processName
以获取表示每个应用程序包名称的字符串process@SteelToe我有。这只给了我自己的应用程序和谷歌搜索栏,而手机上有很多其他应用程序在运行。你是否确保在尝试代码时获得适当的权限?