Android之使用ACTION_USAGE_ACCESS_SETTINGS权限检测手机多少天没有未使用其它APP

1 需求

找出手机多少天没有使用的所有APP

2 思路

通过 ACTION_USAGE_ACCESS_SETTINGS权限得到多少天已经使用的APP的包名,然后获取手机所有用户APP,剩下的APP就是多少天没有使用的APP。

3 ACTION_USAGE_ACCESS_SETTINGS权限申请

1)在AndroidManifest.xml文件里面定义权限

    <uses-permission
        android:name="android.permission.PACKAGE_USAGE_STATS"
        tools:ignore="ProtectedPermissions" />

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<ResolveInfo> 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<String> {
            val runingApps = ArrayList<String>()
            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

原创文章 1110 获赞 743 访问量 332万+

猜你喜欢

转载自blog.csdn.net/u011068702/article/details/106028355