Android, detecta cuando se inician otras aplicaciones

8 minutos de lectura

Android detecta cuando se inician otras aplicaciones
ian

Estoy tratando de 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, solicitando 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 resto, solo la parte 2 me está desconcertando, y después de muchos días leyendo sobre Intentos de transmisión, 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 la intención de comenzar, o debería estar leyendo el registro del sistema en busca de nuevas intenciones o haciendo algo en código nativo?

Cualquier sugerencia ayudaría, incluso si no puede responderla por completo, podré investigar un poco más. Muchas gracias. ian

  • No estoy seguro de cómo lo han hecho, pero aplicaciones como protector de aplicaciones hace exactamente lo que está pidiendo, por lo que es técnicamente posible.

    – hanspeide

    20 de julio de 2010 a las 19:23

  • @lan cómo resolvió su problema, ¿puede compartir su conocimiento?

    – nida

    16 de enero de 2015 a las 5:11

  • hola tuviste la solucion

    – ask4solutions

    24 de febrero de 2016 a las 6:26

Android detecta cuando se inician otras aplicaciones
M.Movaffagh

Creo que podemos usar logcat y analizar su salida.

En todos los programas similares he encontrado este permiso:

android.permission.READ_LOGS

Significa que todos lo usan, pero parece que el programa se inicia y luego nuestro programa (protector de aplicaciones) se iniciará y aparecerá.

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 Manifiesto.

  • por favor, ¿dónde tenemos que poner este código? en un servicio? en el comando onStart()?

    – haythem souissi

    30 de mayo de 2012 a las 1:22

  • no funcionará desde JellyBean y superior. El permiso READ_LOGS ahora está reservado solo para aplicaciones del sistema.

    – Corrió

    14 de julio de 2012 a las 13:18

  • ¿Estás absolutamente seguro de esto? Porque Smart AppLock parece poder hacer esto incluso en dispositivos JB. ¿Se debe a que la aplicación se eleva al estado de Administrador de dispositivos? play.google.com/store/apps/…

    – Karthik Balakrishnan

    16 mayo 2013 a las 18:48


  • @Torcellite, esa aplicación tiene el permiso “Ejecutar tareas”, por lo que podría estar usando esa técnica en su lugar.

    – sam

    27 de abril de 2015 a las 9:30

  • @Ran, entonces, ¿qué hacer para usarlo ahora… hay una solución disponible ahora para resolver el problema mencionado en la pregunta, ya que necesito estar por encima de las gominolas… por favor envíe sus comentarios lo antes posible…

    – Shreyan Mehta

    24 de abril de 2017 a las 14:46

Una forma ingeniosa de hacerlo es tener un servicio con un ciclo cronometrado que verifique

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

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

Nota: esta no es una lista de lo que está realmente en la pantalla, solo una lista de lo que se está ejecutando… tal vez anulando un poco tu objetivo, pero al menos sabrás cuándo algo está comenzando a ejecutarse… seguirá estando en esa lista incluso aunque en segundo plano.

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

1646972710 176 Android detecta cuando se inician otras aplicaciones
Veaceslav Gaidarji

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

Puedes ponerte en marcha Activity y comprueba si esto Activity corresponde a Email solicitud.

Correr CheckRunningActivity Thread en Application start (o en el arranque del dispositivo).

new CheckRunningActivity().start();

Actualizar:
Esta clase necesita android.permission.GET_TASKS permiso, así que agregue la siguiente línea al Manifiesto:

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

  • Estoy usando este enfoque, pero esto abrirá su “// muestra su actividad aquí encima de PACKAGE_NAME.ACTIVITY_NAME” una y otra vez debido al bucle. ¿Alguna solución para eso?

    – Anuj Sharma

    18 de julio de 2014 a las 9:08

  • detenga el subproceso CheckRunningActivity cuando obtenga el resultado deseado

    – Veaceslav Gaidarji

    18 de julio de 2014 a las 9:14

  • Gracias por responder, entonces, ¿cómo/cuándo se reinicia este hilo nuevamente? Estoy usando un servicio Sticky.

    – Anuj Sharma

    18 de julio de 2014 a las 9:17


  • depende del contexto del problema, describa con más detalles qué desea obtener.

    – Veaceslav Gaidarji

    18 de julio de 2014 a las 9:21

  • En su código aquí, el Looper.loop() declaración parece que nunca se ejecutará debido a la while(true) el bucle nunca termina. ¿Es esto un error?

    – sam

    31 de octubre de 2014 a las 10:07

Creo y espero que esto no sea posible. Considere la facilidad con la que el software malicioso podría abusar de dicha funcionalidad. Puede escuchar las intenciones dirigidas a usted y las que se transmiten, pero el inicio de la aplicación no debe ser un evento de transmisión.

Lo que usted puede ser capaz de hacer es reemplazar el lanzador. Si el usuario está de acuerdo con ello.

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

Una intención implícita es cuando quieres decir “Alguien reproduzca este video” y Android elige una aplicación que puede manejar esa intención.

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

AFAIK no hay forma de interceptar tales intenciones explícitas. Es una medida de seguridad integrada en Android que dos actividades no pueden tener el mismo nombre de paquete completo. Esto evita que un tercero clone la aplicación y se haga pasar por esa aplicación. Si lo que desea hacer fuera posible, teóricamente podría instalar una aplicación que podría bloquear el funcionamiento de todas las aplicaciones de su competencia.

Lo que intentas 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 las intenciones a su sistema de seguridad, pero probablemente no sea algo con lo que quiera lidiar.

Android detecta cuando se inician otras aplicaciones
Comunidad

getRunningTasks() está obsoleto en Android L.

Para obtener estadísticas de uso de la aplicación, puede utilizar Estadísticas de uso clase de android.app.uso paquete.

La nueva API de estadísticas de uso de aplicaciones permite a los desarrolladores de aplicaciones recopilar 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 android.permission.PACKAGE_USAGE_STATS permiso 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í es un ejemplo de aplicación básica que muestra cómo usar la API de estadísticas de uso de la aplicación para permitir que los usuarios recopilen estadísticas relacionadas con el uso de las aplicaciones.

1646972711 411 Android detecta cuando se inician otras aplicaciones
jacob malliet

Tal vez necesite un servicio, algo que se ejecute en segundo plano constantemente. Que tu servicio haga lo que dijiste. Escuche el android.intent.action.MAIN también con la categoría android.intent.category.LAUNCHER. Luego, haga que el receptor de transmisión anule el método onReceive y verifique el nombre de la aplicación, etc.

  • Esto suena como el método en el que estaba pensando, pero estoy luchando para recibir la transmisión PRINCIPAL (cat. LAUNCHER) con un BroadcastReceiver básico. ¿Alguien ha logrado hacer esto antes? En esta etapa, solo busco detectar que se ha iniciado o reanudado una aplicación. Luego puedo comparar el nombre del paquete con una cadena que contiene los nombres que estoy buscando.

    – Ian

    21 de julio de 2010 a las 13:47

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad