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 ...
- el usuario hace clic en la aplicación "Correo electrónico" (por ejemplo)
- mi aplicación detecta el inicio de una aplicación
- mi aplicación confirma que es la aplicación "Correo electrónico"
- mi aplicación abre una vista en la parte superior, solicitando una contraseña
- 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 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 distinta a la mía.
¿Alguien puede ayudar? ¿Lo estoy haciendo de la manera correcta, en la búsqueda de nuevas aplicaciones que transmitan una intención de inicio, o debería leer el registro del sistema en busca de nuevas intenciones o hacer 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
Respuestas:
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 se mostrará al frente.
Utilice el siguiente código:
Y no olvide agregar su permiso en el archivo de manifiesto.
fuente
Una forma ingeniosa de hacerlo es tener un servicio con un ciclo cronometrado que verifique
Revisa esa lista para ver qué 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 discriminarlos ...
Nota: esta no es una lista de lo que está realmente en la pantalla, solo una lista de lo que se está ejecutando ... anulando un poco su objetivo tal vez, pero al menos sabrá cuándo algo está comenzando a ejecutarse ... seguirá estando en eso lista incluso cuando está 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.
fuente
android.app.usage
package en su lugar. developer.android.com/reference/android/app/usage/…Creo y espero que esto no sea posible. Considere la facilidad con la que el software malintencionado 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 puede hacer es reemplazar el lanzador . Si el usuario lo acepta.
fuente
Puede ponerse en funcionamiento
Activity
y comprobar siActivity
corresponde a laEmail
aplicación.Ejecutar
CheckRunningActivity
Thread
alApplication
iniciar (o al iniciar el dispositivo).Actualización: esta clase necesita
android.permission.GET_TASKS
permiso, así que agregue la siguiente línea al manifiesto:fuente
Looper.loop()
declaración parece que nunca se ejecutará debido a que elwhile(true)
ciclo nunca termina. ¿Es esto un error?El problema principal es que está tratando de escuchar intenciones implícitas cuando el Lanzador (pantalla de inicio) generalmente usa intenciones explícitas.
Una intención implícita es cuando quieres decir "Alguien reproduce 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 icono "Correo electrónico" en la pantalla de inicio. Específicamente, le dice a Android que abra esa aplicación específica con un nombre completo (es decir, com.android.mail o algo así).
No hay forma de que AFAIK intercepte tales intenciones explícitas. Es una medida de seguridad integrada en Android que no hay dos actividades que tengan 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 la competencia.
Lo que está intentando hacer va en contra del modelo de seguridad de Android.
Una cosa que podría hacer es asociarse con desarrolladores de aplicaciones específicos para reenviar las intenciones a su sistema de seguridad, pero probablemente no sea algo con lo que quiera lidiar.
fuente
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 recopilar estadísticas relacionadas con el uso de las aplicaciones. Esta API proporciona información de uso más detallada que el método getRecentTasks () obsoleto.
Para utilizar esta API, primero debe declarar el
android.permission.PACKAGE_USAGE_STATS
permiso en su manifiesto. El usuario también debe habilitar el acceso a esta aplicación a través deSettings > Security > Apps with usage access
.A continuación, se muestra un ejemplo de aplicación básica que muestra cómo utilizar la API de estadísticas de uso de la aplicación para permitir a los usuarios recopilar estadísticas relacionadas con el uso de las aplicaciones.
fuente
Quizás necesite un servicio, algo que se ejecute en segundo plano constantemente. Que su servicio haga lo que dijo. Escuche android.intent.action.MAIN también con la categoría android.intent.category.LAUNCHER. Luego, haga que ese receptor de transmisión anule el método onReceive y verifique el nombre de la aplicación, etc.
fuente