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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章