2012-07-05 14 views
8

Estoy intentando crear una aplicación donde mi aplicación se ejecuta en segundo plano y detecta cuando el usuario inicia otra aplicación para que yo pueda controlar el flujo desde allí. Para ilustrar mi consulta, me gustaría especificar un ejemplo. Mi aplicación se ejecuta en segundo plano (por ejemplo, como un servicio) y el usuario acaba de hacer clic en la aplicación 'XYZ'. ¿Es posible que mi aplicación detecte que la aplicación 'XYZ' se ha lanzado? Más que solo detectar si 'Actividad de XYZ ha pasado a primer plano, quiero detectar si' XYZ 'se ha lanzado o no. Digamos que alguien lanza 'Whatsapp Messenger', quiero saber si mi aplicación puede saber que se ha lanzado 'Whatsapp Messenger'.¿Cómo detectar cuando el usuario inicia otra aplicación? (Android)

EDITAR: Mucha gente piensa que estoy tratando de construir malware, pero no lo soy. Estoy tratando de construir una aplicación para un proyecto de escuela secundaria. Quiero una estadística para ver la frecuencia con que uso mi cámara como parte de un proyecto de psiquiatría. :/

Gracias de antemano, Sumit.

+0

¿Por qué quieres hacer eso? para citar "** para que pueda controlar el flujo desde allí **" Eso suena dudoso. – t0mm13b

+0

Estoy tratando de construir una aplicación para un proyecto de escuela secundaria. Sin malware :( –

+0

posible duplicado de http://stackoverflow.com/questions/3290936/android-detect-when-other-apps-are-launched – SMR

Respuesta

1

Supongo que deberías echarle un vistazo a las aplicaciones de "protector de aplicaciones" en Google Play. Detectan que el usuario lanzó otra aplicación. Eso se hace leyendo los registros del sistema. Intente abrir LogCat y leer los registros después de iniciar cualquier aplicación en el dispositivo. Te sorprenderás

¿Y a dónde deberías ir desde allí? Supongo que deberías probar la aplicación aLogCat. Es gratuito y de código abierto. Eso te ayudará a leer los registros.

Sin embargo, esto es considerado como una falla de seguridad en Android por parte de algunos desarrolladores.

+0

¿Es cierto Google va a bloquear la lectura de registros en los niveles API 16 y superiores? – gonzobrains

+1

@gonzobrains Ya, supongo. Puede leer los registros solo emitidos por su propio pid. –

+0

@gonzobrains sí, yo bloqueo más de la API 16. m también estoy encontrando el código de hechicería para el almuerzo de la aplicación, incluso. ¿Me pueden ayudar por el mismo –

3

Sí, puede encontrar la aplicación que se inicia, siguiendo el Logcat. Just Track en ActivityManager etiqueta con información -I log.

De adb shell de comandos es,

adb logcat ActivityManager:I *:S 

Desde su código de aplicación,

logcat ActivityManager:I *:S 

Y en Logcat se puede encontrar una línea algo como,

I/ActivityManager( 585): Starting activity: Intent { action=android.intent.action...} 

Cuando cualquier aplicación se lanzará.

Es salida Logcat que muestra que el mensaje se refiere al nivel de prioridad "I" y la etiqueta "ActivityManager":

Actualización:

Apenas añada el permiso en el archivo de manifiesto de la aplicación,

android.permission.READ_LOGS 
+2

Justo Advertencia: este método no es a prueba de balas. Algunos de los teléfonos más nuevos (he sido testigo de GS3) ya no ponen el paquete/actividad en esta declaración de registro. Si no te preocupa el rendimiento, puedes seguir sondeando el ActivityManager.getRecentTasts() para saber cuándo y lo que se inicia – FoamyGuy

+0

no funcionará desde JellyBean +. El permiso READ_LOGS ahora está reservado solo para aplicaciones del sistema.? –

-2

En mi libro, por cierto, usted planteó la pregunta, eso suena como una aplicación de hi-jack de cierta manera para que su servicio lo controle, al margen del malware jinx. Pero no funcionará en Android, claro y simple debido a que los permisos de cada aplicación son diferentes. De este modo, cada aplicación está aislada la una de la otra. Entonces, para responder a su pregunta sin rodeos, es No.

Como sugirió la otra respuesta, puede monitorear el logcat pero ...entonces otra vez ... ¿por qué?

+0

En la medida en que esto sea parte de la API pública, no veo razones para no hacerlo. –

+0

@Mighter Pregunte al OP por qué quiere controlar una aplicación de un servicio. Claro que es parte de la API pública y "no ves razones para no hacerlo", correcto, si alguna vez me enteré de que la aplicación estaba haciendo eso, una palabra: * uninstall *. – t0mm13b

+0

Claro que quiere construir un malware. –

8

no estoy seguro si esta es la mejor manera de hacer esto, pero funciona, puede utilizar el logcat y buscar en su salida, puede utilizar este permiso

android.permission.READ_LOGS 

y utilizar el código de abajo:

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 se olvide de su permiso de manifiesto de Android, se puede añadir este código a un hilo para que funcione

+0

Muchas gracias por su ayuda. No entiendo muy bien el código, pero lo averiguaré, pero ¿qué quisiste decir con la última parte: "agregar este código a un hilo"? ¿Te refieres a ASyncTask o algo similar? Quiero que mi aplicación funcione como un servicio, por lo que puede detectar en cualquier momento si se lanza una aplicación. –

+0

Puede usar solo un hilo normal para hacer esto y si desea que su aplicación se ejecute como un servicio, simplemente coloque el hilo en el servicio y luego coloque el código anterior en el hilo ... un ejemplo de agregar un hilo a un servicio se puede ver aquí: http://stackoverflow.com/questions/4178682/how-to-start-a-new-thread-in-a-service –

+0

Gracias una tonelada. Trataré de implementarlo y dejarte saber el resultado. –

1

he hecho un servicio que puede detectar si otros lanzamientos de aplicaciones. Lo hice por marcador. de manera similar, puede ser reemplazado por cualquier nombre de paquete.

@Override 
public int onStartCommand(Intent intent, int flags, int startId){ 
    Toast.makeText(this,"Service Started", Toast.LENGTH_LONG).show(); 

    final String str = ""; 
    Timer timer = new Timer(); 
    timer.scheduleAtFixedRate(new TimerTask() { 
     int phonelaunched = 0,phoneclosed =0; 
     int phonelaunches = 1; 
     @Override 
     public void run() { 
      ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
      List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfo = am.getRunningAppProcesses(); 

      for (ActivityManager.RunningAppProcessInfo appProcess: runningAppProcessInfo) { 
       Log.d(appProcess.processName.toString(),"is running"); 
       if (appProcess.processName.equals("com.android.dialer")) { 
        if (appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND /*isForeground(getApplicationContext(),runningAppProcessInfo.get(i).processName)*/){ 
         if (phonelaunched == 0){ 
          phonelaunched = 1; 
          Log.d(str,"dude phone has been launched"); 
         } 
         else if (phoneclosed == 1){ 
          phonelaunches++; 
          phoneclosed = 0; 
          Log.d(String.valueOf(phonelaunches),"dude that was counter"); 
         } 
        } 
        else { 
         phoneclosed = 1; 
         Log.d(str,"dude phone has been closed"); 

        } 
       } 
      } 
     } 
    },2000,3000); 

    return START_STICKY; 
} 

Aquí reviso todas las tareas en ejecución y verifico si es nuestra aplicación prevista. Si es así, verifico si la aplicación está en primer plano y la aplicación nunca se inicia con la variable 'lanzada por teléfono'. phoneclosed se usa cuando la aplicación prevista está en segundo plano y la variable se establece en consecuencia.

Todo esto se lleva a cabo en Servicio clase

+1

Este código ya no se ejecutará en Android. Use el paquete 'android.app.usage' en su lugar. https://developer.android.com/reference/android/app/usage/package-summary.html –

+0

Pero tuve que escribirlo para los dispositivos que se ejecutan debajo de lollipop. ¿Podemos usar directamente android.app.usage en los dispositivos de lollipop a continuación? –

Cuestiones relacionadas