¿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. : /
- Android: servicio destruido cuando se gira la pantalla
- Android: El servicio se detiene cuando la actividad está cerrada
- ¿Android mata cada servicio o el proceso entero?
- Obtener eventos táctiles (coordenadas, MotionEvents, etc.) en un servicio
- Android RemoteExceptions and Services
Gracias de antemano, Sumit.
- Clear Aplicaciones recientes limpiar la memoria de aplicaciones y mi receptor dejó de funcionar
- Servicio eficiente de fondo para el seguimiento de la ubicación del usuario
- Android MediaProjectionManager en servicio
- Alternativa al método finish () para la clase de servicio? Matarlo muerto
- Android Service preguntas sobre bind / unbind?
- Cómo leer los datos del acelerómetro en Service with Android
- ¿Cómo comprobar todos los servicios en ejecución en android?
- ¿Debo usar PendingIntent.getService () o getBroadcast con AlarmManager?
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?