2011-03-02 18 views
15

Hay una clase de aplicaciones de Android que permiten la protección con contraseña en ciertas aplicaciones especificadas por el usuario; por ejemplo, Android Protector. Necesito abordar este problema desde una dirección diferente.Prevenir automáticamente aplicaciones comenzando desde el iniciador

¿Es posible crear una aplicación que bloquee todos los lanzamientos de actividades a menos que estén en una lista blanca predefinida? ¿Habrá consecuencias involuntarias con este enfoque? Estoy familiarizado con los conceptos básicos de Android y he escrito algunas aplicaciones razonablemente simples, pero todavía estoy tratando de descubrir cómo estas aplicaciones "Protector" interceptan los intentos de lanzamiento correctamente. ¿Alguien me importaría darme una breve descripción de la forma correcta de hacer esto?

El problema básico es que tenemos un teléfono Android genérico que debe estar bloqueado para que nuestros clientes (solo internos) puedan acceder a nuestras aplicaciones personalizadas sin poder jugar "Need for Speed", etc. Me gustaría para eliminar el bloatware del portador, pero rootear el dispositivo parece que sería un dolor de cabeza de mantenimiento. Queremos que la configuración de cada teléfono sea tan simple como instalar algunas aplicaciones personalizadas.

+1

sólo quiero añadir que este teléfono y aplicaciones asociadas no se dará a conocer al público; es solo interno Si alguien tiene una respuesta externa, agradecería eso también. – WorkerThread

+1

Buena pregunta. Tengo curiosidad por mí mismo. –

+0

¿Qué tal escribir un iniciador personalizado que muestre solo las aplicaciones permitidas? (También necesitaría bloquear Android Market, porque los usuarios podrían comenzar a instalar aplicaciones dentro del mercado) – TomTasche

Respuesta

7

Editado dar más detalles sobre la solución

general

Mi solución simple fue la de añadir un nuevo servicio y la actividad a mi solicitud. El servicio usa Handler y postDelayed para programar continuamente la tarea de supervisión. La tarea de supervisión comprueba que la actividad actual esté en la lista blanca. Obtener la actividad que se está ejecutando actualmente implica ActivityManager y una llamada al getRunningTasks. Después de finalizar el control, la tarea de monitoreo se programa para ejecutarse de nuevo después de X segundos (1, en mi caso).

Si la actividad en la parte superior no está en la lista blanca, iniciamos la actividad de bloqueo que aparece sobre lo que se está ejecutando actualmente. La parte clave de la actividad de bloqueo es que anula onBackPressed, lo que impide que el usuario simplemente vuelva a la actividad "incorrecta". Presionar la tecla Inicio es la única forma (que yo sepa) de abandonar esta pantalla.

Consejos

  • construir una puerta trasera en la pantalla de bloqueo. Por ejemplo, mi solución solicita una contraseña al presionar prolongadamente la tecla Atrás. Después de ingresar la contraseña correcta, el servicio del monitor se queda dormido durante 5 minutos para que pueda realizar mi trabajo administrativo
  • Mostrar el nombre de la actividad bloqueada
  • ¡Reúna una buena lista blanca antes de encenderla! Actividades que definitivamente debe incluir en la lista blanca: el iniciador, instalador de paquetes, su propia aplicación (obviamente), el navegador, si su aplicación tiene un componente basado en web

No me gusta que mi servicio se repita constantemente en el fondo; parece derrochador Me gustaría encontrar una forma de recibir notificaciones cuando se inicie una nueva tarea, pero no pude encontrar la manera de hacerlo. El uso de la batería para mi valor particular del período del monitor y mi teléfono particular es aceptable; aunque definitivamente debes probar antes de adoptar esto tú mismo.

+0

Me interesa este enfoque. ¿Te importaría publicar el código? ¿Experimentó algún problema con esta técnica? –

+0

@WorkerThread Muy interesante! Realmente estoy investigando para nuestros clientes después de recibir $ 400 de facturas de datos este mes :) ¿Se les ocurrió una solución mejor? ¿Tal vez algún tipo de servicio de sistema para interceptar eventos de iniciador? – katit

4

una solución Efectiva, y aquí está el código de la opinión del autor

public class MonitorService extends Service { 

private Handler handler; 
Runnable runnable; 

@Override 
public void onCreate() { 
    // TODO Auto-generated method stub 
    super.onCreate(); 
    handler = new Handler(); 
    runnable = new Runnable() { 
     @Override 
     public void run() { 
      new Thread(new Runnable() { 
       @Override 
       public void run() { 

        ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 

        List<ActivityManager.RunningTaskInfo> taskInfo = am 
          .getRunningTasks(1); 

        ComponentName componentInfo = taskInfo.get(0).topActivity;      
        String currentActivityName=componentInfo.getClassName(); 
        String packageName=componentInfo.getPackageName(); 
        if(whitelist.contains(currentActivityName)){ 

         Intent launchIntent = new Intent(); 
         launchIntent.setComponent(new ComponentName(blockActivityPackageName, 
           blockActivityName)); 
         launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
         startActivity(launchIntent); 

        } 

       } 
      }).start(); 
      handler.postDelayed(this, 1000); 
     } 
    }; 
    handler.postDelayed(runnable, 1000); 
} 

@Override 
public void onStart(Intent intent, int startId) { 
    super.onStart(intent, startId); 
} 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    Intent intent = new Intent(this, MonitorService.class); 
    startService(intent); 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    return START_STICKY; 
} 
Cuestiones relacionadas