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

Android, обнаружение при запуске других приложений

Я пытаюсь разработать приложение, которое не позволяет пользователю перейти к указанному приложению без пароля. Сценарий...

  • пользователь нажимает на приложение "Электронная почта" (например)
  • мое приложение обнаруживает запуск приложения.
  • мое приложение подтверждает, что это приложение "Электронная почта"
  • мое приложение открывает представление сверху, запрашивая пароль
  • пользователь вводит пароль, если это правильно, мое приложение исчезает, оставляя приложение "Электронная почта" сверху

Я все в порядке, только часть 2 меня озадачивает, и после многих дней, читая информацию о вещательных намерениях и т.д. и пытаясь слушать "android.intent.action.MAIN" и т.д. в моих пробных проектах, я не может показаться, что обнаруживается, когда приложение, отличное от моего, запускается.

Может ли кто-нибудь помочь? Я собираюсь сделать это правильно, в поисках новых приложений, вещающих с намерением начать, или я должен читать системный журнал для новых намерений или делать что-то в собственном коде?

Любые указатели помогут, даже если вы не сможете полностью ответить на него, я смогу сделать еще несколько исследований. Большое спасибо. Ian

4b9b3361

Ответ 1

Я думаю, мы можем использовать logcat и анализировать его вывод.

Во всех подобных программах я нашел это разрешение:

android.permission.READ_LOGS

Это означает, что все они используют его, но, похоже, программа запускается, и после этого наша программа (приложение-протектор) начнет и начнет перемещаться вперед.

Используйте код ниже:

try
    {
        Process mLogcatProc = null;
        BufferedReader reader = null;
        mLogcatProc = Runtime.getRuntime().exec(new String[]{"logcat", "-d"});

        reader = new BufferedReader(new InputStreamReader(mLogcatProc.getInputStream()));

        String line;
        final StringBuilder log = new StringBuilder();
        String separator = System.getProperty("line.separator"); 

        while ((line = reader.readLine()) != null)
        {
            log.append(line);
            log.append(separator);
        }
        String w = log.toString();
        Toast.makeText(getApplicationContext(),w, Toast.LENGTH_LONG).show();
    }
    catch (Exception e) 
    {
        Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
    }

И не забудьте добавить его в файл манифеста.

Ответ 2

Умный способ сделать это - иметь сервис с синхронизированным циклом, который проверяет

ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfo = am.getRunningAppProcesses();

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

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

Для парольной игры вы можете просто начать свою деятельность, когда найдете приложение это защищено или что-то еще.

Ответ 3

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

Что вы можете сделать, это заменить пусковую установку. Если пользователь соглашается с этим.

Ответ 4

class CheckRunningActivity extends Thread{
    ActivityManager am = null;
    Context context = null;

    public CheckRunningActivity(Context con){
        context = con;
        am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    }

    public void run(){
        Looper.prepare();

        while(true){
            // Return a list of the tasks that are currently running,
            // with the most recent being first and older ones after in order.
            // Taken 1 inside getRunningTasks method means want to take only
            // top activity from stack and forgot the olders.
            List< ActivityManager.RunningTaskInfo > taskInfo = am.getRunningTasks(1);

            String currentRunningActivityName = taskInfo.get(0).topActivity.getClassName();

            if (currentRunningActivityName.equals("PACKAGE_NAME.ACTIVITY_NAME")) {
                // show your activity here on top of PACKAGE_NAME.ACTIVITY_NAME
            }
        }
        Looper.loop();
    }
}

Вы можете получить текущий запуск Activity и проверить, соответствует ли этот Activity приложению Email.

Запустите CheckRunningActivity Thread в начало Application (или при загрузке устройства).

new CheckRunningActivity().start();

Update: Для этого класса требуется разрешение android.permission.GET_TASKS, поэтому добавьте следующую строку в манифест:

<uses-permission android:name="android.permission.GET_TASKS" />

Ответ 5

Основная проблема заключается в том, что вы пытаетесь прослушивать неявные намерения, когда Launcher (домашний экран) обычно использует явные намерения.

Неявное намерение - это когда вы хотите сказать: "Кто-то играет это видео", а Android выбирает приложение, которое может справиться с этим намерением.

Явное намерение - это то, что происходит, когда вы нажимаете значок "Электронная почта" на главном экране. Это специально говорит Android, чтобы открыть это конкретное приложение с полным именем (то есть com.android.mail или что-то еще).

АААИК не может перехватить такие явные намерения. Это мера безопасности, встроенная в Android, которая не может иметь одно и то же полное имя пакета. Это препятствует тому, чтобы третья сторона клонировала приложение и маскировалась как это приложение. Если то, что вы хотите сделать, было возможно, вы могли бы теоретически установить приложение, которое могло бы заблокировать все ваши приложения-конкуренты от работы.

То, что вы пытаетесь сделать, противоречит модели безопасности Android.

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

Ответ 6

getRunningTasks() устарел в Android L.

Чтобы получить статистику использования приложений, вы можете использовать UsageStats класс из android.app.usage.

Новый API статистики использования приложений позволяет разработчикам приложений собирать статистику, связанную с использованием приложений. Этот API предоставляет более подробную информацию об использовании, чем устаревший метод getRecentTasks().

Чтобы использовать этот API, вы должны сначала объявить разрешение android.permission.PACKAGE_USAGE_STATS в своем манифесте. Пользователь должен также разрешить доступ для этого приложения через Settings > Security > Apps with usage access.

Здесь - пример базового приложения, показывающий, как использовать API статистики использования приложений, чтобы пользователи могли собирать статистику, связанную с использованием приложений.

Ответ 7

Возможно, вам нужна услуга, которая будет постоянно работать в фоновом режиме. Чем ваша служба сделает то, что вы сказали. Слушайте android.intent.action.MAIN также с категорией android.intent.category.LAUNCHER. Затем этот широковещательный приемник переопределит метод onReceive и проверит, чтобы увидеть имя приложения и т.д.