Подтвердить что ты не робот

Блокирование приложений для Android

Я попытался разработать такое приложение, в том смысле, что хочу заблокировать все приложения на своем устройстве с помощью пароля, который я хочу. Но я не нашел какой-либо части кода для решения. Поэтому я разработал один сам и, к сожалению, этого не удалось. Я нашел много решений для блокировки устройств Android, но не нашел их для блокировки приложения. Будем рады, если вы предложите решение.

4b9b3361

Ответ 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;
}