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



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




  1. пользователь нажимает на приложение "электронная почта" (например)

  2. мое приложение обнаруживает запуск приложения

  3. мое приложение подтверждает, что это приложение "электронная почта"

  4. мое приложение открывает вид сверху, запрашивая пароль

  5. пользователь вводит пароль, если правильно, мое приложение исчезает, оставляя приложение " электронная почта топ


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



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



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

589   7  

7 ответов:

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

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

android.permission.READ_LOGS

это означает, что все они используют его, но кажется, что программа запускается, и после этого наша программа (App protector) запустится и принесет фронт.

использовать ниже код :

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();
    }

и не забудьте добавить это разрешение в Манифесте.

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

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

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

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

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

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

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

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 приложение.

Run CheckRunningActivityThread on Application начать (или при загрузке устройства).

new CheckRunningActivity().start();

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

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

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

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

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

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

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

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

getRunningTasks() является устаревшим в Android L.

для получения статистики использования приложения вы можете использовать UsageStats класс android.приложение.использование пакета.

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

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

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

возможно, Вам нужен сервис, что-то, что будет работать в фоновом режиме постоянно. Тогда пусть ваша служба сделает то, что вы сказали. Слушайте для андроида.намерение.действие.Главное также с категорией android.намерение.категория.ПУСКОВАЯ УСТАНОВКА. Затем этот широковещательный приемник переопределяет метод onReceive и проверяет, чтобы увидеть имя приложения и т. д.

Comments

    Ничего не найдено.