
ian
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 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, 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 Intentos de transmisión, 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 la intención de comenzar, o debería estar leyendo el registro del sistema en busca de nuevas intenciones o haciendo 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

M.Movaffagh
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 aparecerá.
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 Manifiesto.
Una forma ingeniosa de hacerlo es tener un servicio con un ciclo cronometrado que verifique
ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfo = am.getRunningAppProcesses();
Revisa esa lista para ver lo que 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 discriminar …
Nota: esta no es una lista de lo que está realmente en la pantalla, solo una lista de lo que se está ejecutando… tal vez anulando un poco tu objetivo, pero al menos sabrás cuándo algo está comenzando a ejecutarse… seguirá estando en esa lista incluso aunque 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.

Veaceslav Gaidarji
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();
}
}
Puedes ponerte en marcha Activity
y comprueba si esto Activity
corresponde a Email
solicitud.
Correr CheckRunningActivity
Thread
en Application
start (o en el arranque del dispositivo).
new CheckRunningActivity().start();
Actualizar:
Esta clase necesita android.permission.GET_TASKS
permiso, así que agregue la siguiente línea al Manifiesto:
<uses-permission android:name="android.permission.GET_TASKS" />
Creo y espero que esto no sea posible. Considere la facilidad con la que el software malicioso 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 usted puede ser capaz de hacer es reemplazar el lanzador. Si el usuario está de acuerdo con ello.
El problema principal es que está tratando de escuchar intenciones implícitas cuando el Iniciador (pantalla de inicio) generalmente usa intenciones explícitas.
Una intención implícita es cuando quieres decir “Alguien reproduzca 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 ícono “Correo electrónico” en la pantalla de inicio. Le dice específicamente a Android que abra esa aplicación específica con un nombre completamente calificado (es decir, com.android.mail o algo así).
AFAIK no hay forma de interceptar tales intenciones explícitas. Es una medida de seguridad integrada en Android que dos actividades no pueden tener 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 su competencia.
Lo que intentas 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 las intenciones a su sistema de seguridad, pero probablemente no sea algo con lo que quiera lidiar.

Comunidad
getRunningTasks()
está obsoleto en Android L.
Para obtener estadísticas de uso de la aplicación, puede utilizar Estadísticas de uso clase de android.app.uso paquete.
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 android.permission.PACKAGE_USAGE_STATS
permiso 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
.
Aquí es un ejemplo de aplicación básica que muestra cómo usar la API de estadísticas de uso de la aplicación para permitir que los usuarios recopilen estadísticas relacionadas con el uso de las aplicaciones.

jacob malliet
Tal vez necesite un servicio, algo que se ejecute en segundo plano constantemente. Que tu servicio haga lo que dijiste. Escuche el android.intent.action.MAIN también con la categoría android.intent.category.LAUNCHER. Luego, haga que el receptor de transmisión anule el método onReceive y verifique el nombre de la aplicación, etc.
No estoy seguro de cómo lo han hecho, pero aplicaciones como protector de aplicaciones hace exactamente lo que está pidiendo, por lo que es técnicamente posible.
– hanspeide
20 de julio de 2010 a las 19:23
@lan cómo resolvió su problema, ¿puede compartir su conocimiento?
– nida
16 de enero de 2015 a las 5:11
hola tuviste la solucion
– ask4solutions
24 de febrero de 2016 a las 6:26