Я попытался разработать такое приложение, в том смысле, что хочу заблокировать все приложения на своем устройстве с помощью пароля, который я хочу. Но я не нашел какой-либо части кода для решения. Поэтому я разработал один сам и, к сожалению, этого не удалось. Я нашел много решений для блокировки устройств Android, но не нашел их для блокировки приложения. Будем рады, если вы предложите решение.
Блокирование приложений для Android
Ответ 1
Я использовал фоновый сервис, чтобы проверить, какое приложение находится на переднем плане (это означает, что приложение используется пользователем). Затем я проверяю, нужно ли мне блокировать приложение или нет.
Чтобы найти список всех установленных приложений (за исключением системных приложений):
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);
Этот же код используется и для кнопки отмены.
Ответ 2
Похоже, что это все еще загадка, как было предложено вышеупомянутыми комментариями. Поэтому я помещаю код, который помог мне решить эту проблему.
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
к 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;
}