Android之使用ACTION_USAGE_ACCESS_SETTINGS权限检测手机多少天没有未使用其它APP
16lz
2021-01-25
1 需求
找出手机多少天没有使用的所有APP
2 思路
通过 ACTION_USAGE_ACCESS_SETTINGS权限得到多少天已经使用的APP的包名,然后获取手机所有用户APP,剩下的APP就是多少天没有使用的APP。
3 ACTION_USAGE_ACCESS_SETTINGS权限申请
1)在AndroidManifest.xml文件里面定义权限
2) 声明权限后还再需要通过Intent启动方式申请,打开相应的界面,同意当前的APP权限。
val intent = Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS) startActivityForResult(intent, REQUEST_SYSTEM_USAGE_ACCESS_CODE)
4 判断是否获取ACTION_USAGE_ACCESS_SETTINGS权限
/** * 判断是否已经获取 有权查看使用情况的应用程序 权限 * * @param context * @return */ public static boolean isStatAccessPermissionSet(Context context) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { try { PackageManager packageManager = context.getPackageManager(); ApplicationInfo info = packageManager.getApplicationInfo(context.getPackageName(), 0); AppOpsManager appOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);// appOpsManager.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, info.uid, info.packageName); return appOpsManager.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, info.uid, info.packageName) == AppOpsManager.MODE_ALLOWED; } catch (Exception e) { e.printStackTrace(); return false; } } else { return true; } }
/** * 查看是存在查看使用情况的应用程序界面 * * @return */ public static boolean isNoOption(Context context) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { PackageManager packageManager = context.getPackageManager(); Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS); List list = new ArrayList<>(); //进程间通讯有可能异常 try { list.addAll(packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY)); } catch (Exception e) { e.printStackTrace(); } return list.size() > 0; } return false; }
/** * 权限检查 */ fun checkUsedPermission():Boolean { if(!isStatAccessPermissionSet(this) && isNoOption(this)) { return false } else { return true } }
因为我们一开始是用startActivityForResult这种方式打开界面,我们可以在onActivityResult里面进行权限的相关判断再处理
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) Log.i(TAG, "onActivityResult start requestCode is:" + requestCode) if (requestCode == REQUEST_SYSTEM_USAGE_ACCESS_CODE) { var result = checkUsedPermission() Log.i(TAG, "onActivityResult result is ${result}") if (result) { init() } else { //finish Log.i(TAG, "has no ACTION_MANAGE_WRITE_SETTINGS"); ToastUtils.showShort(R.string.text_please_allow_permisson) finish() } } }
5 检测多久时间内使用了其它APP
/** * 查询使用在多少小时使用了app */ fun getRuningAppsNoContainSelf(context: Context, hour: Int): List { val runingApps = ArrayList() val sUsageStatsManager = context.getSystemService(Context.USAGE_STATS_SERVICE) as UsageStatsManager val endTime = System.currentTimeMillis() val beginTime = endTime - TimeUnit.HOURS.toMillis(hour.toLong()) val event = UsageEvents.Event() val usageEvents = sUsageStatsManager.queryEvents(beginTime, endTime) while (usageEvents.hasNextEvent()) { usageEvents.getNextEvent(event) if (event.eventType == UsageEvents.Event.MOVE_TO_FOREGROUND) { val pkg = event.packageName LogUtil.i("获取使用过的应用", "pkg为${pkg}") if (!TextUtils.isEmpty(pkg) && !CLEAN_NOT_CONTAIN_LIST.contains(pkg)) { if (!runingApps.contains(pkg)) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { } runingApps.add(event.packageName) } } } } return runingApps }
比如是10天内,我们那个hour参数传递10 * 24
更多相关文章
- Android群英传读书笔记-----控件架构
- Android(安卓)从setContentView谈Activity界面的加载过程
- 学个明白--Android控件架构
- AndroidManifest详解之Application(有图更好懂)
- 关于Android(安卓)的系统架构
- 聊聊android界面适配
- android用户界面编程技巧――如何使用Adapter
- android ANR处理方法
- Android(安卓)壁纸设置代码 详解