Android, detecta cuando se lanzan otras aplicaciones

Intento desarrollar una aplicación que evite que un usuario acceda a una aplicación específica sin una contraseña. El escenario es …

  1. el usuario hace clic en la aplicación “Correo electrónico” (por ejemplo)
  2. mi aplicación detecta el lanzamiento de una aplicación
  3. mi aplicación confirma que es la aplicación “Correo electrónico”
  4. mi aplicación abre una vista en la parte superior, pidiendo una contraseña
  5. el usuario ingresa una contraseña, si es correcta, mi aplicación desaparece, dejando la aplicación “Correo electrónico” en la parte superior

Estoy bien haciendo el rest, solo la parte 2 me deja perplejo, y después de muchos días leyendo sobre Broadcast Intents, etc. y tratando de escuchar “android.intent.action.MAIN”, etc. en mis proyectos de prueba, no puedo parece detectar cuando se inicia una aplicación que no sea la mía.

¿Alguien puede ayudar? ¿Lo estoy haciendo de la manera correcta, buscando nuevas aplicaciones que transmitan un bash de comenzar, o debería leer el registro del sistema para nuevas intenciones o hacer algo con código nativo?

Cualquier sugerencia ayudaría, incluso si no puedes responderla completamente, podré investigar un poco más. Muchas gracias. Ian

Creo que podemos usar logcat y analizar su salida.

En todos los progtwigs similares, he encontrado este permiso:

android.permission.READ_LOGS

Significa que todos lo usan, pero parece que el progtwig se inicia y, a continuación, nuestro progtwig (protector de la aplicación) se iniciará y mostrará el frente.

Use el siguiente código:

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

Y no olvide agregar su permiso en el archivo Manifest.

Una manera innovadora de hacerlo es tener un servicio con un ciclo temporizado que verifica

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

Revisa esa lista para ver qué se está ejecutando en el teléfono. Ahora puedes identificarlos con ids y processName, por lo que para la actividad estándar esto es fácil para los personalizados, a menos que los detengas a todos es difícil de discriminar …

Nota: esta no es una lista de lo que está realmente en la pantalla, solo una lista de lo que está funcionando … algo así como anular tu objective, pero al menos sabrás cuando algo está comenzando a correr … seguirá estando en eso lista aunque en el fondo sin embargo.

Para la contraseña, puede comenzar su actividad cuando encuentre una aplicación protegida o lo que sea.

Pienso y espero que esto no sea posible. Considere cuán fácilmente esa funcionalidad podría ser abusada por software malicioso. Puede escuchar los bashs dirigidos a usted, y aquellos que se transmiten, pero el lanzamiento de la aplicación no debe ser un evento de transmisión.

Lo que puedes hacer es reemplazar el lanzador . Si el usuario está de acuerdo.

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

Puede obtener la Activity actual y verificar si esta Activity corresponde a la aplicación de Email electrónico.

Ejecute el Thread CheckRunningActivity en el inicio de la Application (o en el inicio del dispositivo).

 new CheckRunningActivity().start(); 

Actualización: esta clase necesita el permiso android.permission.GET_TASKS , así que agrega la siguiente línea al Manifiesto:

  

El problema principal es que estás tratando de escuchar intenciones implícitas cuando el Iniciador (pantalla de inicio) normalmente usa intenciones explícitas.

Un bash implícito es cuando quiere decir “Somebody play this video” y Android elige una aplicación que pueda manejar esa intención.

Un bash explícito es lo que sucede cuando hace clic en el ícono “Correo electrónico” en la pantalla de inicio. Específicamente le dice a Android que abra esa aplicación específica con un nombre completamente calificado (es decir, com.android.mail o algo así).

No hay forma de que AFAIK intercepte dichos bashs explícitos. Es una medida de seguridad integrada en Android que no hay dos actividades que puedan tener el mismo nombre de paquete completamente calificado. Esto evita que un tercero clone la aplicación y se haga pasar por esa aplicación. Si lo que desea hacer es posible, en teoría podría instalar una aplicación que podría bloquear el funcionamiento de todas las aplicaciones de su competencia.

Lo que intenta hacer va en contra del modelo de seguridad de Android.

Una cosa que podría hacer es asociarse con desarrolladores de aplicaciones específicas para reenviar los bashs a su sistema de seguridad, pero eso probablemente no sea algo con lo que quiera lidiar.

getRunningTasks() está en desuso en Android L.

Para obtener estadísticas de uso de la aplicación, puede usar la clase UsageStats del paquete android.app.usage .

La nueva API de estadísticas de uso de aplicaciones permite a los desarrolladores de aplicaciones recostackr estadísticas relacionadas con el uso de las aplicaciones. Esta API proporciona información de uso más detallada que el método obsoleto getRecentTasks ().

Para usar esta API, primero debe declarar el permiso android.permission.PACKAGE_USAGE_STATS en su manifiesto. El usuario también debe habilitar el acceso para esta aplicación a través de Settings > Security > Apps with usage access .

Aquí hay un ejemplo de aplicación básica que muestra cómo usar la API de estadísticas de uso de aplicaciones para que los usuarios puedan recostackr estadísticas relacionadas con el uso de las aplicaciones.

Quizás necesite un servicio, algo que se ejecutará en segundo plano constantemente. Que tu servicio haga lo que dijiste. Escucha el android.intent.action.MAIN también con la categoría android.intent.category.Launcher. Luego haga que el receptor de difusión anule el método onReceive y verifique para ver el nombre de la aplicación, etc.