studio - start broadcast receiver android
Android, detecta cuando se lanzan otras aplicaciones (7)
Intento 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 lanzamiento 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, pidiendo 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 deja perplejo, 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 que no sea la mía.
¿Alguien puede ayudar? ¿Lo estoy haciendo de la manera correcta, buscando nuevas aplicaciones que transmitan un intento de comenzar, o debería leer el registro del sistema para nuevas intenciones o hacer algo con código nativo?
Cualquier sugerencia ayudaría, incluso si no puedes responderla completamente, podré investigar un poco más. Muchas gracias. Ian
El problema principal es que estás tratando de escuchar intenciones implícitas cuando el Iniciador (pantalla de inicio) normalmente usa intenciones explícitas.
Un intento implícito es cuando quiere decir "Somebody play this video" y Android elige una aplicación que pueda manejar esa intención.
Un intento explícito es lo que sucede cuando hace clic en el ícono "Correo electrónico" en la pantalla de inicio. Específicamente le dice a Android que abra esa aplicación específica con un nombre completamente calificado (es decir, com.android.mail o algo así).
No hay forma de que AFAIK intercepte dichos intentos explícitos. Es una medida de seguridad integrada en Android que no hay dos actividades que puedan tener el mismo nombre de paquete completamente calificado. Esto evita que un tercero clone la aplicación y se haga pasar por esa aplicación. Si lo que desea hacer es posible, en teoría podría instalar una aplicación que podría bloquear el funcionamiento de todas las aplicaciones de su competencia.
Lo que intenta 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 los intentos a su sistema de seguridad, pero eso probablemente no sea algo con lo que quiera lidiar.
Pienso y espero que esto no sea posible. Considere cuán fácilmente esa funcionalidad podría ser abusada por software malicioso. Puede escuchar los intentos dirigidos a usted, y aquellos que se transmiten, pero el lanzamiento de la aplicación no debe ser un evento de transmisión.
Lo que puedes hacer es reemplazar el lanzador . Si el usuario está de acuerdo.
Quizás necesite un servicio, algo que se ejecutará en segundo plano constantemente. Que tu servicio haga lo que dijiste. Escucha el android.intent.action.MAIN también con la categoría android.intent.category.Launcher. Luego haga que el receptor de difusión anule el método onReceive y verifique para ver el nombre de la aplicación, etc.
Una manera innovadora de hacerlo es tener un servicio con un ciclo temporizado que verifica
ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfo = am.getRunningAppProcesses();
Revisa esa lista para ver qué se está ejecutando en el teléfono. Ahora puedes identificarlos con ids y processName, por lo que para la actividad estándar esto es fácil para los personalizados, a menos que los detengas a todos es difícil de discriminar ...
Nota: esta no es una lista de lo que está realmente en la pantalla, solo una lista de lo que está funcionando ... algo así como anular tu objetivo, pero al menos sabrás cuando algo está comenzando a correr ... seguirá estando en eso lista aunque en el fondo sin embargo.
Para la contraseña, puede comenzar su actividad cuando encuentre una aplicación protegida o lo que sea.
getRunningTasks()
está en desuso en Android L.
Para obtener estadísticas de uso de la aplicación, puede usar la clase UsageStats del paquete developer.android.com/reference/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 obsoleto getRecentTasks ().
Para usar esta API, primero debe declarar el permiso android.permission.PACKAGE_USAGE_STATS
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
.
Here hay un ejemplo de aplicación básica que muestra cómo usar la API de estadísticas de uso de aplicaciones para que los usuarios puedan recopilar estadísticas relacionadas con el uso de las aplicaciones.
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, a continuación, nuestro programa (protector de la aplicación) se iniciará y mostrará el frente.
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 Manifest.
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();
}
}
Puede obtener la Activity
actual y verificar si esta Activity
corresponde a la aplicación de Email
electrónico.
Ejecute el Thread
CheckRunningActivity
en el inicio de la Application
(o en el inicio del dispositivo).
new CheckRunningActivity().start();
Actualización: esta clase necesita el permiso android.permission.GET_TASKS
, así que agrega la siguiente línea al Manifiesto:
<uses-permission android:name="android.permission.GET_TASKS" />