sábado, 5 de mayo de 2012

SMSMorseConverter

      Una vez terminada a tiempo la aplicación AudioSense (con todas las mejoras propuestas) decidimos hacer la aplicación de traducción de mensajes a código Morse (SMSMorseConverter). Se trata de una aplicación que traduce a las personas ciegas/sordo-ciegas  los mensajes de texto de la bandeja de entrada de su dispositivo móvil a código Morse.
 
  Los primeros objetivos propuestos para esta aplicación fueron los siguientes:

- Desarrollar una aplicación Android, que traduzca los mensajes de la bandeja de entrada a código Morse a través de vibraciones.

- Investigar cómo acceder a los mensajes y extraerlos de la bandeja de entrada.

-  Conseguir coger el texto adecuado de cada mensaje.

- Enseñar los mensajes por pantalla para que el usuario pueda seleccionar el que quiera.

- Traducir la cadena de caracteres elegida a código Morse.

Lo primero que hicimos fue crear un programa capaz de acceder a los mensajes y que nos pasara a un TextView los mensajes para poder traducirlos. En un primer momento intentamos acceder con los métodos de la clase Intent, pero no éramos capaces de acceder a los mensajes de esta forma.

      Tras buscar posibles soluciones encontramos una más sencilla, el uso de la clase Cursor, con la que se puede acceder a los mensajes y a otros servicios de Android a través de la instrucción:
        
         Uri uri = Uri.parse("donde quieras acceder");
         cur = getContentResolver().query(uri, null, null, null,null);
        
     Para acceder a mensajes lo que teníamos que hacer era añadir Uri.parse("content://sms/inbox”), y así  conseguimos acceder a la bandeja de entrada de los mensajes del dispositivo.

          Para extraer el cuerpo del mensaje y el número de teléfono del usuario que nos manda el mensaje tenemos que hacerlo mediante el método getString a la columna correcta donde se encontraba el dato que queríamos. Pero aquí nos encontramos con un problema ya que nos dimos cuenta que esa columna no es la misma para cada uno de los dispositivos Android, por eso en vez de poner una constante, obtuvimos mediante el método (getColumnIndex()), la columna donde se encontraba el número de teléfono y el cuerpo del mensaje (variable para cada dispositivo). Finalmente decidimos que la fecha también pues era un parámetro importante para el usuario.
  
            Una vez hecho esto, solo teníamos que pasar al TextView con setText() la cadena de caracteres, y presentarlo en la pantalla de nuestra aplicación.
  
           Ya habíamos conseguido acceder a los mensajes. Ahora teníamos que poder seleccionar un mensaje de la lista y traducirlo a vibraciones. Para que pudiésemos seleccionar un mensaje de la lista vimos necesario implementar un ListView, que te proporciona una lista de elementos que puedes seleccionar, ya que era más sencillo que un conjunto de text Views.
  
           Para crear un ListView era necesario también crear un ArrayAdapter, donde tiene que estar incluida la lista de elementos que va a mostrar el ListView. Para crear este ArrayAdapter tuvimos algunos problemas ya que no sabíamos que parámetros te pedían en el constructor. Una vez conseguido buscando a través de Internet, al ejecutarlo en el emulador de Eclipse, nos salía un NullPointerException, y no entendíamos el porqué. Nos dimos cuenta que la razón era porque el emulador no tenía ningún  mensaje, y por lo tanto no se creaba una lista de elementos, haciendo que fuese null la lista y el ListView no la pudiera representar.
 
            Una vez probada en el móvil, ya vimos que funcionaba perfectamente hasta el momento.
 
           El siguiente paso era definir qué hacer cuando seleccionabas un elemento de la lista. Lo único que queríamos que hiciese por ahora es que cuando “dásemos” pusiese seleccionado, para comprobar que funcionaba. Pensamos que teníamos que poner el mismo método que usábamos cuando pulsamos un botón, setOnClickListener(), pero nos dimos cuenta de que no era así, ya que era un elemento de una lista, no un botón, por tanto el método que había que usar era:
 
   lista.setOnItemClickListener(new OnItemClickListener() {
         public void onItemClick(AdapterView<?> a, View v, int position, long id) {
 
            Éste nos permite realizar cualquier acción al pulsar un elemento de la lista, la cual la tenemos que definir (en nuestro caso, traducción a código Morse de la cadena de caracteres deseada), y además podíamos distinguir entre posiciones con el parámetro position.
           
            Después de haber conseguido esto, solo nos quedaba traducir el mensaje a código Morse. Buscando encontramos que ya había hechos algunos código que traducían  a código Morse. El que más nos gustó fue el de Android developers, al cual le pasas un String como parámetro y te lo traduce a vibraciones.

            Ya habíamos terminado la aplicación, pero nos dimos cuenta que el traductor solo tenía las letras básicas (no tenía la ñ) y no tenía ningún signo como el guión, el punto… Por eso añadimos al código de Android developers algunos caracteres más: “ñ”, “.”, “,”, ”?”, “!”, “-“, “:”; cambiando el código inicial.                                                                                                                           
 
            Con ello decidimos también tratar las vocales con acentos, es decir, el código inicial las trataba como caracteres desconocidos y nosotros los que hicimos fue hacer que las vocales con acentos fuesen tratadas como vocales sin éstos.
 
            Además, nos encontramos con un error en el código, ya que si ponías un parámetro desconocido, en vez de no vibrar, vibraba como si fuese un punto (en código Morse) por cada carácter desconocido, es decir, como la “e” en código Morse, creando confusión. Esto se producía porque si no reconocía un carácter, dejaban un espacio (GAP), y lo añadían al array de los parámetros de vibración, sin darse cuenta que el GAP, en el patrón de vibración se ponía en los huecos de vibración del patrón y por lo tanto vibraba el tiempo que tendría que estar en “silencio”. Para solucionarlo lo que hicimos fue añadir al array de no reconocer caracteres un 0 en vez de un tiempo de GAP.
 
Para que la aplicación no forzase cierre cuando en el dispositivo no hubiese mensajes lo que hicimos es que cuando no hay mensajes te muestre un elemento de la lista que ponga “no hay mensajes”, y si lo pulsamos el dispositivo vibra durante 500ms, para que la persona sepa que no hay mensajes.
 
Los mensajes los mostrábamos con la siguiente estructura y es la cadena de caracteres que se traducía a código Morse:
 
"Mensaje del telefono: nº de teléfono. Con fecha: fecha y con contenido: cuerpo del mensaje
 
Se muestra a continuación la primera interfaz gráfica:
  
        Después de hacer este programa nos dimos cuenta de que no era del todo funcional para las personas sordo ciegas (a las que iba dirigida la aplicación), ya que tenían que seleccionar el mensaje tocando en una parte concreta de la pantalla y no sería útil para ellos, por eso pensamos otra manera de implementarlo seleccionando los mensajes de una forma diferente.
 
    Próximos objetivos:

- Adecuar la aplicación de traducción de mensajes a código Morse para que sea funcional para las personas sordo-ciegas.

- Realizar una batería de pruebas con diversas situaciones de uso de la aplicación y limpiar esos posibles errores, como hicimos con la aplicación AudioSense.

No hay comentarios:

Publicar un comentario