Android, обнаружение при запуске других приложений
Я пытаюсь разработать приложение, которое не позволяет пользователю перейти к указанному приложению без пароля. Сценарий...
- пользователь нажимает на приложение "Электронная почта" (например)
- мое приложение обнаруживает запуск приложения.
- мое приложение подтверждает, что это приложение "Электронная почта"
- мое приложение открывает представление сверху, запрашивая пароль
- пользователь вводит пароль, если это правильно, мое приложение исчезает, оставляя приложение "Электронная почта" сверху
Я все в порядке, только часть 2 меня озадачивает, и после многих дней, читая информацию о вещательных намерениях и т.д. и пытаясь слушать "android.intent.action.MAIN" и т.д. в моих пробных проектах, я не может показаться, что обнаруживается, когда приложение, отличное от моего, запускается.
Может ли кто-нибудь помочь? Я собираюсь сделать это правильно, в поисках новых приложений, вещающих с намерением начать, или я должен читать системный журнал для новых намерений или делать что-то в собственном коде?
Любые указатели помогут, даже если вы не сможете полностью ответить на него, я смогу сделать еще несколько исследований. Большое спасибо. Ian
Ответы
Ответ 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 и проверит, чтобы увидеть имя приложения и т.д.