Utilizando clases de SDK DevicePolicyManager OS 2.2 en Android mientras se admiten dispositivos OS 2.1

Quiero usar algunas DevicePolicyManager métodos en mi aplicación. DevicePolicyManager se introdujo en OS 2.2, pero mi aplicación debe continuar ejecutándose en dispositivos con OS 2.1.

Aquí hay un seudocódigo para lo que quiero hacer:

if (needSecurity)
{
  if (runningOS2.2orGreater) 
  {
    // Invoke the required security policy, e.g.
    setPasswordQuality(myComponentName, PASSWORD_QUALITY_NUMERIC)
  }
  else
  {
    // Tell the user they can't use this feature
  }
}

Desde leer los documentos, creo que también podría necesitar una DeviceAdminReceiver para manejar devoluciones de llamada onPasswordFailed y onPasswordSucceeded.

De otras preguntas de Stackoverflow (por ejemplo,aqu), Creo que tengo dos opciones:

1. Reflexió

Continúe compilando contra OS 2.1 SDK y use la reflexión para invocar clases en tiempo de ejecución, por ejemplo,

Class myClass =                                                                        
  ClassLoader.getSystemClassLoader().loadClass("android.app.admin.DevicePolicyManager")

Object DPMInstance = myClass.newInstance();                                            

Method myMethod = myClass.getMethod("setPasswordQuality",                              
                                    new Class[] { ComponentName.class,                 
                                                  int.class });                        
myMethod.invoke(DPMInstance,                                                           
                new Object[] { myComponentName,                                        
                               PASSWORD_QUALITY_NUMERIC });                            

Si necesito implementar un DeviceAdminReceiver, ¿funcionará la reflexión? ¿Cómo manejaría las devoluciones de llamada a DeviceAdminReceiver y volvería a llamar a mis propias clases de aplicación?

2. Clase condicional cargando

Cambiar para compilar contra el OS 2.2 SDK. En tiempo de ejecución, solo cargue las clases de OS 2.2 si la versión actual del dispositivo es OS 2.2 o posterior, por ejemplo,

int sdk = new Integer(Build.VERSION.SDK).intValue();

if (sdk > 7) 
{
  sLog.info("OS 2.2 or later");
  return new myClassImplementsDeviceAdminInterfaces();
}
else
{
  sLog.info("OS 2.1 or earlier");
  return new myClassDoesNotSupportDeviceAdmin();
}

Parece que este enfoque producirá un código más fácil de soportar, y presumiblemente también funcionará con un DeviceAdminReceiver. ¿Alguien sabe de algún inconveniente o complicació

Entonces, mis preguntas son:

¿Recomendaría la reflexión o la carga de clase condicional para usar DevicePolicyManager? ¿Necesitaré un DeviceAdminReceiver, o puedo detectar si el usuario tiene una contraseña adecuada, p. llamando repetidamente a isActivePasswordSufficient en mi aplicación para confirmar que se ha hecho? Cualquier otro consejo si los tiene (por ejemplo,esta pregunt sugiere que podría haber problemas que obliguen al usuario a restablecer su contraseña).

¡Gracias

Respuestas a la pregunta(1)

Su respuesta a la pregunta