¿Cómo detectar cuándo el usuario inicia otra aplicación? (Androide)
Estoy tratando de construir una aplicación donde mi aplicación se ejecuta en segundo plano y detecta cuando el usuario inicia otra aplicación para que pueda controlar el flujo desde allí. Para ilustrar mi consulta, me gustaría especificar un ejemplo. Mi aplicación se ejecuta en segundo plano (como un servicio), y el usuario acaba de hacer clic en la aplicación 'XYZ'. ¿Es posible que mi aplicación detecte que se ha lanzado la aplicación 'XYZ'? Más que simplemente detectar si la Actividad de XYZ ha llegado al primer plano, quiero detectar si XYZ ha sido lanzado o no. Digamos que alguien inicie 'Whatsapp Messenger', quiero saber si mi aplicación puede saber que 'Whatsapp Messenger' ha sido lanzado.
EDIT: Mucha gente piensa que estoy tratando de crear malware, pero no lo estoy. Estoy tratando de construir una aplicación para un proyecto de escuela secundaria. Quiero una estadística para ver la frecuencia con la que uso mi cámara como parte de un proyecto de psicología. : /
- Solicitar contraseña antes de desinstalar la aplicación
- ¿Sigue funcionando un servicio incluso cuando el teléfono está dormido?
- Escuchar el botón de volumen cuando el teléfono está bloqueado android
- El servicio no se inició en BOOT COMPLETE
- ¿Cómo liberar el recurso de micrófono cuando otra aplicación de Android lo necesita?
Gracias de antemano, Sumit.
- Servicio de fondo en Android - Necesita ayuda
- Opcionalmente, iniciar actividades y utilizar notificaciones de servicios en Android. Sólo lanzar o notificar si una determinada aplicación está presente
- Android reproduciendo música en fondo
- Android - Obtención de contexto de un receptor de difusión onReceive () para enviar a
- Atrapar en el golpe para despedir el evento
- Uso del servicio de aplicación en otra aplicación
- Servicio de Android Cerrar inesperadamente
- Android startService Synchronous?
No estoy seguro de si esta es la mejor manera de hacerlo, pero funciona, puede utilizar el logcat
y mirar su salida, puede utilizar este permiso
android.permission.READ_LOGS
Y utilice 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 se olvide de su permiso en android manifiesto, puede agregar este código a un hilo para que funcione
Sí, puede encontrar la aplicación que se inicia, mediante el seguimiento de la Logcat . Solo rastrea la etiqueta de ActivityManager con información -I registro.
De adb shell El comando es,
adb logcat ActivityManager:I *:S
Desde su código de aplicación,
logcat ActivityManager:I *:S
Y en Logcat usted puede encontrar una línea algo así como,
I/ActivityManager( 585): Starting activity: Intent { action=android.intent.action...}
Cuando se lance cualquier aplicación.
Es salida logcat que muestra que el mensaje se relaciona con el nivel de prioridad "I" y la etiqueta "ActivityManager":
Actualizar:
Simplemente agregue permiso en el archivo de manifiesto de su aplicación,
android.permission.READ_LOGS
Supongo que deberías echar un vistazo a las aplicaciones "protector de aplicaciones" en Google Play. Detectan que el usuario ha iniciado otra aplicación. Esto se logra leyendo los registros del sistema. Intente abrir LogCat y leer los registros después de haber iniciado cualquier aplicación en el dispositivo. Usted se sorprenderá.
¿Y adónde ir desde allí? Supongo que deberías probar la aplicación aLogCat . Es libre y de código abierto. Eso le ayudará a leer los registros.
Sin embargo, todo esto se considera una violación de seguridad en Android por algunos desarrolladores.
He hecho un servicio que puede detectar si se inicia otra aplicación. Lo he hecho para el dialer. Similarmente que 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í voy a través de todas las tareas en ejecución y comprobar si es nuestra aplicación prevista. Si es así, compruebo si la aplicación es de primer plano y la aplicación nunca se inicia con la variable 'phonelaunched'. Phoneclosed se utiliza cuando la aplicación prevista está en segundo plano y la variable se establece en consecuencia.
Todo esto se implementa en la clase de servicio
En mi libro, por la forma en que planteó la pregunta, que suena como hi-jacking una aplicación de cierta manera para que su servicio de control, bordeando el malware jinx. Pero no funcionará en Android – simple y simple debido a los permisos de cada aplicación es diferente. De esta manera, cada aplicación está aislada entre sí. Así que para responder a su pregunta sin rodeos, su No.
Como la otra respuesta sugirió – usted puede supervisar el logcat pero .. entonces otra vez … porqué?
- Reproducir varias canciones con MediaPlayer al mismo tiempo: solo una está jugando
- ¿Cómo cambiar la actividad en el botón de navegación inferior?