Capturar los cambios de modo

Cuando la configuración de protección de contenido de un dispositivo BlackBerry cambia, el marco de protección de contenido llama al método persistentContentModeChanged() del servicio de escucha. Por ejemplo, el método recibe la llamada si se desactiva o se activa el cifrado, o si cambia la intensidad de cifrado de protección de contenido.

Cuando su servicio de escucha recibe la notificación de un cambio en la configuración de protección de contenido, debe revisar todos los datos que ha almacenado y asegurarse de que los datos codificados cumplen los requisitos impuestos por la nueva configuración de protección de contenido.

La primera cosa que persistentContentModeChanged debe hacer es obtener un pase de protección de contenido. Debe obtener un pase para asegurarse de que las claves de cifrado, que puede necesitar para volver a codificar sus datos, siguen estando disponibles siempre que las necesite. Si no obtiene un pase, el marco podría interrumpir la disponibilidad de las claves de descifrado cuando esté descifrando los datos sin saberlo, impidiendo de esta forma que el proceso se complete. Cuando intente obtener un pase, deberá asegurarse siempre de que lo ha conseguido (es decir, que el pase devuelto no sea nulo). Si el pase es nulo, probablemente no desee volver a realizar la codificación, porque se producirán excepciones en el caso de que tenga que descifrar los datos.

Si el pase no es nulo, su aplicación puede empezar a comprobar y, si necesario, volver a codificar sus datos.

Si comprueba y vuelve a codificar una gran cantidad de datos, es posible que desee detener el proceso de vez en cuando para comprobar si el valor de generación ha cambiado. El valor de generación es un número entero que se incrementa cada vez que la configuración de la protección de contenido se modifica (o, más generalmente, cada vez que se produce un evento de cambio de modo). Puede comprobar el valor de generación mediante PersistentContent.getGeneration(). Si el valor de generación ofrecido como la parte de la llamada a persistentContentModeChanged() es diferente del valor vuelto por getGeneration(), sabrá que la configuración de la protección de contenido del dispositivo ha cambiado. Si se encuentra procesando los datos de su aplicación para ajustarlos a una generación concreta y, al comprobar el valor de generación, descubre que éste ha cambiado desde que inició el procesamiento, deseará reiniciar el proceso de comprobación/codificación con el nuevo valor de la generación. Se trata de una manera de optimizar la implementación de este método si está gestionando una gran cantidad de datos de una sola vez.

Una vez que todos los datos se han comprobado y, si necesario, se han vuelto a codificar, deberá anular el pase de protección de contenido. Es muy importante que anule el pase, ya sea explícitamente, configurándolo como nulo, o implícitamente, asegurándose de que el método en el que se solicitó el pase finalice en cuanto termine la operación para la que se necesita. Si no anula el pase, el marco no sabrá cuándo es seguro ocultar las claves de descifrado.

El método persistentContentModeChanged() también recibe una llamada en los casos siguientes:

  • El marco de protección de contenido ha descifrado 2053 veces objetos que se cifraron mientras el dispositivo estaba bloqueado.

  • El marco de protección de contenido detecta datos que no están codificados, pero que deberían estarlo según la configuración de protección de contenido del dispositivo.

  • El marco de protección de contenido detecta datos que no están cifrados, pero que deberían estarlo según la configuración de compresión y cifrado de una aplicación.

Ejemplo de código

El ejemplo de código siguiente es una implementación sencilla de persistentContentModeChanged. El ejemplo comprueba y, si necesario, vuelve a codificar los elementos individuales de una matriz Object llamados datos. Esta matriz es un campo miembro de la clase contenedora.

Cada elemento de la matriz de datos se pasa al método checkEncoding() para determinar si se encuentra codificado de acuerdo con la configuración de protección de contenido actual. Si no es así, se llama al método reEncode() para codificar los datos según los nuevos estándares.

    public void persistentContentModeChanged(int generation)
     {        
          Object ticket = PersistentContent.getTicket();
          if( ticket != null ) {
              for( int i = 0; i < data.length; i++ ) {
                  if( ! PersistentContent.checkEncoding( data[ i ] ) {
                      data[ i ] = PersistentContent.reEncode( data[ i ] );
                  }
              }
          }
          ticket = null; 
     }

¿Le ha resultado útil esta información? Envíenos sus comentarios.