Автоматически предотвращать запуск приложений из панели запуска - PullRequest
15 голосов
/ 02 марта 2011

Существует класс приложений Android, которые обеспечивают защиту паролем в определенных пользовательских приложениях;например, Android Protector .Мне нужно подойти к этой проблеме с другой стороны.

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

Основная проблема заключается в том, что у нас есть универсальный телефон Android, который необходимо заблокировать, чтобы наши клиенты (только внутренние) могли получить доступ к нашимпользовательские приложения без возможности воспроизведения «Need for Speed» и т. д. Я хотел бы удалить вредоносную программу-носитель, но рутирование устройства выглядит как головная боль при обслуживании.Мы хотим, чтобы настройка каждого телефона была такой же простой, как установка нескольких пользовательских приложений.

Ответы [ 3 ]

7 голосов
/ 03 марта 2011

Отредактировано для уточнения решения

Обзор

Моим простым решением было добавить новый сервис и действие в мое приложение.Служба использует Handler и postDelayed для непрерывного планирования задачи мониторинга.Задача мониторинга проверяет, находится ли текущая активность в белом списке.Получение текущего выполняемого действия включает в себя ActivityManager и вызов getRunningTasks.После завершения проверки задача мониторинга сама запустится через X секунд (в моем случае - 1).

Если активность сверху отсутствует в белом списке, мы запускаем операцию блокировки, которая появляется поверхчто бы ни работало в данный момент.Ключевой частью действия блокировки является то, что оно переопределяет onBackPressed, не позволяя пользователю просто вернуться к «плохому» действию.Нажатие клавиши «Домой» - единственный способ (насколько мне известно) покинуть этот экран.

Советы

  • Создание бэкдора на экране блокировки.Например, мое решение запрашивает пароль при длительном нажатии клавиши «назад».После ввода правильного пароля служба мониторинга переходит в спящий режим на 5 минут, чтобы я мог выполнять свою административную работу
  • Отображать имя заблокированной активности
  • Соберите хороший белый список перед включением!Действия, которые вы должны обязательно внести в белый список: средство запуска, установщик пакетов, собственное приложение (очевидно), браузер, если в вашем приложении есть веб-компонент

Мне не нравится, что мой сервис постояннозацикливание на заднем плане;это кажется расточительным.Я хотел бы найти способ получать уведомления при запуске новой задачи, но я не мог найти способ сделать это.Использование батареи для моего конкретного значения периода монитора и моего конкретного телефона является приемлемым;хотя вы должны обязательно проверить, прежде чем принять это самостоятельно.

4 голосов
/ 14 мая 2013

эффективное решение, а вот код, по мнению автора

public class MonitorService extends Service {

private Handler handler;
Runnable runnable;

@Override
public void onCreate() {
    // TODO Auto-generated method stub
    super.onCreate();
    handler = new Handler();
    runnable = new Runnable() {
        @Override
        public void run() {
            new Thread(new Runnable() {
                @Override
                public void run() {

                    ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);

                    List<ActivityManager.RunningTaskInfo> taskInfo = am
                            .getRunningTasks(1);

                    ComponentName componentInfo = taskInfo.get(0).topActivity;                      
                    String currentActivityName=componentInfo.getClassName();
                    String packageName=componentInfo.getPackageName();
                    if(whitelist.contains(currentActivityName)){

                        Intent launchIntent = new Intent();
                        launchIntent.setComponent(new ComponentName(blockActivityPackageName,
                                blockActivityName));
                        launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        startActivity(launchIntent);

                    }

                }
            }).start();
            handler.postDelayed(this, 1000);
        }
    };
    handler.postDelayed(runnable, 1000);
}

@Override
public void onStart(Intent intent, int startId) {
    super.onStart(intent, startId);
}

@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onDestroy() {
    super.onDestroy();
    Intent intent = new Intent(this, MonitorService.class);
    startService(intent);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
}
0 голосов
/ 14 марта 2011

Как вы предлагаете, написание пользовательского модуля запуска, вероятно, будет чище;проверьте этот лаунчер с открытым исходным кодом для справки http://code.google.com/p/adw-launcher-android/

...