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