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