Программная блокировка приложений для Android
Я пытался разработать такое приложение, в том смысле, что я хочу заблокировать все приложения на моем устройстве паролем, какой бы я ни хотел. Но я не нашел ни одного кода для решения. Так что я разработал один самостоятельно, и, к сожалению, это не удалось. Я нашел много решений для блокировки устройств Android, но не нашел решения для блокировки приложений. Будем рады, если вы предложите решение.
2 ответа
Я использовал фоновый сервис, чтобы проверить, какое приложение находится на переднем плане (это означает, что приложение используется пользователем). Затем я проверяю, нужно ли мне заблокировать приложение или нет.
Чтобы найти список всех установленных приложений (кроме системных приложений):
PackageManager packageManager = getPackageManager();
Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> appList = packageManager.queryIntentActivities(mainIntent, 0);
Collections.sort(appList, new ResolveInfo.DisplayNameComparator(packageManager));
List<PackageInfo> packs = packageManager.getInstalledPackages(0);
for (int i = 0; i < packs.size(); i++) {
PackageInfo p = packs.get(i);
ApplicationInfo a = p.applicationInfo;
// skip system apps if they shall not be included
if ((a.flags & ApplicationInfo.FLAG_SYSTEM) == 1) {
continue;
}
appList.add(p.packageName);
}
Чтобы найти текущее приложение переднего плана:
ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> RunningTask = mActivityManager.getRunningTasks(1);
ActivityManager.RunningTaskInfo ar = RunningTask.get(0);
activityOnTop=ar.topActivity.getClassName();
Здесь имя класса предоставляет имя пакета приложения. Я предлагаю вам использовать имя пакета для идентификации любого приложения, чтобы мы знали, что имя пакета всегда уникально.
Теперь о функциональности блокировки приложения:
Чтобы определить, какое приложение запущено на переднем плане, и хотите заблокировать его, нам просто нужно запустить другое действие, в котором есть EditText для пароля и кнопки "ОК" и "Отмена".
Intent lockIntent = new Intent(mContext, LockScreen.class);
lockIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(lockIntent);
При нажатии OK, если пароль правильный, просто завершите действие LockScreen. Если пароль неверный, просто используйте приведенный ниже код, который закрывает приложение и показывает домашний экран устройства:
Intent startHomescreen = new Intent(Intent.ACTION_MAIN);
startHomescreen.addCategory(Intent.CATEGORY_HOME);
startHomescreen.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(startHomescreen);
Тот же код также используется на кнопке отмены.
Похоже, что это все еще остается загадкой, как предлагается вышеупомянутыми комментариями. Поэтому я помещаю код, который помог мне решить эту проблему.
getForegroundApp
public String getForegroundApp() {
String currentApp = "NULL";
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
UsageStatsManager usm = (UsageStatsManager) this.mContext.getSystemService(Context.USAGE_STATS_SERVICE);
long time = System.currentTimeMillis();
List<UsageStats> appList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000 * 1000, time);
if (appList != null && appList.size() > 0) {
SortedMap<Long, UsageStats> mySortedMap = new TreeMap<Long, UsageStats>();
for (UsageStats usageStats : appList) {
mySortedMap.put(usageStats.getLastTimeUsed(), usageStats);
}
if (mySortedMap != null && !mySortedMap.isEmpty()) {
currentApp = mySortedMap.get(mySortedMap.lastKey()).getPackageName();
}
}
} else {
ActivityManager am = (ActivityManager) this.mContext.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> tasks = am.getRunningAppProcesses();
currentApp = tasks.get(0).processName;
}
return currentApp;
}
Вызов getForegroundApp()
и он вернет строку, которая содержит имя currentForegroundApp, включая имя пакета, например com.example.app
Теперь, чтобы использовать этот код, нам нужна эта строка кода в Manifest
файл
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />
и принять пользователя Usage Data access Settings
:
usageAccessSettingsPage
public void usageAccessSettingsPage(){
Intent intent = new Intent();
intent.setAction(Settings.ACTION_USAGE_ACCESS_SETTINGS);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri uri = Uri.fromParts("package", mContext.getPackageName(), null);
intent.setData(uri);
startActivity(intent);
}
или вручную, найдя в LockScreen and Security
> Other security settings
> Usage access data
,
Теперь идет часть для блокировки приложения, эта часть очень хорошо освещена в ответе Амит. Однако, если кто-то ищет способ запретить пользователю использовать приложение, то хитрость заключается в том, чтобы открыть домашний экран при запуске определенного приложения.
Это можно сделать, вызвав следующий метод, когда currentApp
равно заблокированному приложению
if(<NameOfBlockedApp>.equals currentApp){
showHomeScreen();
}
ShowHomeScreen
public boolean showHomeScreen(){
Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(startMain);
return true;
}