Usos creativos para su smartphone


La virtual omnipresencia de Android como el sistema operativo móvil más socorrido para los dispositivos móviles alrededor del mundo no es ninguna novedad  pues  hoy por hoy se estima que prácticamente 8 de cada 10 smartphones en el planeta pertenecen a esta plataforma, de acuerdo con los datos más recientes de Strategy Analytics.

Precisamente  por este motivo es fácil que nos encontremos  con varios terminales Android en casa sin encontrar   una utilidad aparente.

En este contexto para reusar nuestro viejo terminal o  simplemente para explorar  otros usos  a continuación  se van  a mostrar  algunos usos  “diferentes ” de nuestros terminales Android.

 

1-Navegador sin conexión

Quizás la navegación sea una de las utilidades mas interesantes para nuestro smartphone pues gracias a su pequeño tamaño es apto para caminar, montar en bicicleta o como no para guiarnos mientras conducimos en un vehículo motorizado.

Con la  aplicación Google Maps para teléfonos y tablets Android, navegar por el mundo  nunca ha sido  tan fácil  y barato  , pues hoy en día es raro encontrar un  smartphone sin gps  ni tarifa de  datos. Gracias  a  esta aplicación completamente  gratuita   puede  descubrir los mejores sitios de la ciudad y obtener la información que necesita para llegar a  cualquier parte , sin que le cueste un céntimo.

Pero,  como se comentaba  a  pesar de las grandes bondades  , Google Map  posee un talón de aquiles : navegar en modo offline ya que, aunque nos deja guardar porciones de mapa en nuestro dispositivo, si viajamos en un lugar con mala cobertura  de datos  o  al extranjero y no contamos con datos móviles, nos encontraremos con que el navegador no funcionará  ya que necesita de una conexión para trazar el mejor recorrido .Así que cuando llega ese problema, lo mejor es tener a mano un navegador que nos permita acceder a los mapas y a sus rutas completamente offline, sin necesidad de datos 3G, 4G o Wifi al estilo  de los navegadores GPS    dedicados   que hasta hace muy poco copaban el mercado

Aunque hemos hablado en mas de una ocasión en este blog  de estos ,   vamos  a hacer un pequeño resumen de las diferentes opciones  para Android de navegadores que permitan navegación  offline (es decir sin necesitar una conexión de datos)  aqui.

2- Mando  a distancia avanzado  para su smart-tv

 

En el caso de poseer  una TV o un blue-ray   con función smart-tv , a través de un aplicación a medida  que dependera del fabricante   se pueden controlar  servicios de Google, Canales online en Cloud TV y más películas, juegos y aplicaciones como  nunca antes se habia hecho.

En caso de tener na TV o un blue-ray   con función smart-tv Philips   la app   Philps MyRemote   es una aplicación inteligente que le ayuda a organizar la experiencia de visualización de televisión como quieras.

Puede sustituir a su mando a distancia convencional y ofrece muchas funciones adicionales como introducción sencilla de texto y uso compartido de los archivos multimedia de tu sistema de cine en casa, junto con otras muchas opciones.

Tambien permite controlar su televisor Smart LED de Philips conectado utilizando una sola aplicación. La aplicación MyRemote de Philips ofrece todas las opciones de control del mando a distancia original, lo que convierte al dispositivo inteligente en un mando a distancia universal. Además, añade funciones adicionales como la introducción de texto sencilla.
Ahora puede transmitir imágenes, vídeos y música fácilmente desde el ordenador, el smartphone o la tableta a tu televisor Smart LED de Philips con solo pulsar un botón de la aplicación

En tabletas de Android, se puede navegar a través de la guía electrónica de programación, consultar las valoraciones y seleccionar el canal sin interrumpir lo que esté viendo en ese momento.

Si encuentra otro programa que quiere ver, solo tiene que seleccionarlo en la tableta y el televisor cambiará a ese programa.

3- Controlar  el reproductor de youtube  de  su smart-tv

Por cierto si sólo quiere controlar  los vídeos que se reproducen desde la aplicación de youtube de su smart-tv , no siempre es necesario instalar  la app la  anterior   o  la de otra fabricante , pues en la mayopria de los casos  bastara   con sincronizar  la app de  youtube de su smart-tv o blue-ray  con  nustra app de youtube  de  nuestro  smartphone  .

Esta facilidad la suelen dar las TV modernas  gracias a un codigo QR  o una url corta  que generan automaticamente usando la propia app  de su TV ( consulte como hacerlo en el manual de su TV)

Para usar dicha función, simplemente escaneando éste código desde nuestro smartphone (por ejemplo con la app  BIDI)   y aceptando  la sincronizacion en nuestro smartphone , este permite comandar la app de youtube del TV desde la app youtube de nuestro smartphone.

 

4-Generador de señales

Es sorprendente que gran parte de la instrumentación  reservada tan sólo hace unos años  a ordenadores de sobremesa   utilizando sw especifico  , se esté poco  a poco desplazando  a terminales portátiles  (IOS o Android) sin importar su tamaño , básicamente por la gran facilidad de su uso, unido a su interfaces táctiles, que los hacen  ideales para este tipo de instrumentación.

En efecto podemos usar el puerto de sonido, tanto en entrada como en salida  para diferentes  fines para los que fue diseñado, por ejemplo, en este caso, como generador de señales de diferente forma y amplitud,   gracias al uso de  aplicaciones gratuitas que puede explorar en este blog aqui

 

5-Interfaz de  didiagnóstico

OBD-II PID ( Diagnóstico a bordo de parámetros IDs ) son códigos utilizados para solicitar datos de un vehículo, que se utiliza como herramienta de diagnóstico  que tradicionalmente se ha reservado a los  técnicos automotrices que usan PID con una herramienta de análisis conectado al conector OBD-II del vehículo.

 

Hoy en día gracias a la creciente potencia computacional unido al bajo precio del hardware  ya es posible  a los aficionados  interpretar los códigos OBD-II y de paso incluso poder ahorrarnos visitas rutinarias al taller por detalles  de poca  importancia ( como el reseteo  de alarmas sin importancia).

El programa mas famoso  de auto-diagnostico   interpretando los códigos OBD-II   es la aplicación de pago TORQUE-pro , aunque existe una versión gratuita de la misma.Necesitara una pequeña llave bluetooth muy económica que deberá insertar en el interfaz. Puede encontrar mucha mas información en este blog aqui.

 

6-Osciloscopio

 

 

Como hemos comentado en este blog, es  posible convertir su smartphone en  unOsciloscopio  sin  hacer  uso de hardware  externo, usando  el puerto de sonido en entrada también para un uso diferente para los que fue diseñado, por ejemplo, en este caso para presentar de forma gráfica la señal analógica que le introducimos por la toma de micrófono gracias al uso de aplicaciones gratuitas  que puede ver en este blog  aqui.

7-Medidor de radiación

Como hablábamos en este blog,  es posible  medir sin un contador geiger el nivel de radiación ionizante con nuestro smartphone y eso si  usar ningún hardware adicional.

La   idea  bastante disruptiva  es  usar el sensor cmos de la  cámara  tan sólo    cubriendo  la lente de la cámara con  algo  opaco ( por ejemplo  con un trozo de cinta aislante negra adhesiva)   pues  según han comprobado muchos expertos , la mayoría de los sensores  Cmos de los CCD de las cámaras pueden medir la radiación gamma si el objeto esta completamente  a oscuras  ( es decir con un  trozo de cinta opaco ) y usando un software  especial.

Si quiere  revisar las aplicaciones disponibles  consulte   aqui.

 

8-Funcionar como brújula

Uno de los aparatos que con el auge de los smartphones ha pasado a mejor vida es la brújula. Está claro que los profesionales y expertos seguirán utilizándolas, pero para sacarnos de un apuro y saber dónde está el norte siempre podremos recurrir a nuestro Android.

La aplicación 3D compass funciona perfectamente gracias al uso que hace del acelerómetro de nuestro móvil.

Es una herramienta útil para seguir la dirección que usted especifique. Especifica el norte magnético. La precisión depende de la calidad de su hardware. No requiere conexión a Internet. Los objetos metálicos pueden causar interferencias.En esta app  la brújula y el fondo son personalizables  y  es gratuita en Google Play Sotore aqui:  3D compass

9-Medir distancias

Otro de los usos que podemos hacer es medir todo tipo de distancias, perfecto para substituir las cintas métricas.   Metro Distancia (telémetro) es una aplicación gratuita de telémetro. 

Esta aplicación calcular aproximadamente la distancia del objeto utilizando el algoritmo matemático.
Usted puede medir fácilmente la distancia de un objeto (destino).
Metros (m), pies (ft) y yarda (yd) son compatibles con esta aplicación distancia inteligente.
Cómo utilizar esta aplicación :
1. Escriba la altura de la lente mediante el botón de ajuste.
2. Apunte la cámara hacia abajo objeto y botón táctil D para el cálculo de la distancia del objeto.
3. Apunte la cámara hacia objeto superior y tocar el botón H para el cálculo de la altura del objeto..

 

 

10- Microscopio o lupa

 

Una serie de aplicaciones que incluso aprovechando la cámara de nuestro smartphone podremos tener gracias a un complemento, un pequeño microscopio portátil. Por ejempo con la aplicación  Lupa& microscopio  puede convertir su teléfono en una lupa (lupa). No es necesario llevar una lupa más. !Utilice el teléfono inteligente como una lupa a mano, como un microscopio práctico o e como una cámara macro mano!

Funciones:
+ Live H / W Ampliación
+ Live S / W Ampliación (H / W x 4)
+ Flash LED de luz
+ Macro Cámara
+ Congelación de imagen
+ Embedded visor de fotografía
+ Filtros de imagen (Negativo, Sepia, Mono)
+ WYSIWYG países
+ Y Más

¿Tiene que quitarse las gafas para leer una tarjeta de visita?¿Tiene que llevar una lupa grande para leer el número de modelo de un pequeño semiconductor?¿Usted utiliza un microscopio para observar las patas de un insecto diminuto?¿Quieres tomar fotos macro con facilidad? Quizás la solución la tenga con esta sencilla aplicación

 

11-Determinar nuestro ritmo cardiaco

El Galaxy S5 ha puesto de moda los lectores de pulso en los móviles. Pero para aquellos que gustan de hacer ejercicio pueden utilizar cualquier tipo de smartphone para hacerlo. Os dejamos una serie de aplicaciones que a través de nuestros temblores podrán fijar con más o menos precisión, nuestro ritmo.

heart beat frecuencia cardiaca app android

Los lectores de ritmo cardíaco, en el momento en que el deporte se ha aliado con los smartphones de una manera tan íntima, están empezando a ser más habituales. ¿Qué utilizáis para medir vuestro pulso después de hacer ejercicio?

12-Medir la temperatura y espectrofotometría

Nos ponemos científicos. Nuestros móviles son una auténtica navaja suiza, pero a veces necesitan de pequeños complementos. Gracias a varias aplicaciones podemos utilizar nuestros móviles para medir distancias muy pequeñas, perfectas a la hora de clavar un clavo o así. Pero no solo distancia, también calor y temperatura.

thermodo

En Kickstarter se presentaba Thermodo, un pequeño aparato que unido a su aplicación permite determinar la temperatura de la zona. Una solución que hasta la espera de Nest, es lo más cercano que tenemos entre Android y la energía. Y Finalmente tenemos ese proyecto de espectrofotometría para análisis bioquímicos que ya describimos en su día.

 

 

13-Vigilar como si fuera una cámara de seguridad

Que tengamos una cámara no significa que solo sea para hacer selfies. También puede grabar vídeo. Y de qué manera. Gracias a la gran batería de los últimos smartphones y la calidad de sus sensores, se han creado apps como AtHome Camera para convertir nuestro smartphone en una suite de seguridad para vigilar nuestra casa.

Necesitaremos conexión a internet para hacerla funcionar. Pero ey, nada mejor que utilizar Android para vigilarnos. Si Google lo hace ya, ¿por qué nosotros no?

14 -Domótica

La domótica es muy popular estos días, y la tecnología que la consigue también la encontraremos en Android. Controlar los objetos de nuestro alrededor a distancia mediante el smartphone es posible gracias a aplicaciones de control remoto.

Bloquear puertas de nuestro vehículo, encender el termostato y controlar prácticamente cualquier aparato electrónico inteligente es posible gracias al control remoto, un uso que hoy en día no deja de ser muy puntual pero que con el auge de los sistemas multidispositivo vamos a empezar a ver mucho más habitualmente.

 

Seguro  que se le ocurre mil usos más de los  aqui  resumido como  reproductor multimedia, telefono IP, cámara de seguridad IP,  radio mundial , gramola universal ( usando  el servicio spotify) , etc, !el limite sólo esté en nuestra imaginación!

Fuente aqui

Anuncios

Construccion de una app con Android que interactua con Netduino


Esta es una guía  paso a paso  planteada  a modo de completo tutorial, que le llevará a través de todo el proceso paso a paso. El autor Greg Zimmers   ha  incluido una aplicación Android de trabajo se puede utilizar “tal cual” o usarlo como punto de partida y mejorarlo.

 

 

Vamos a empezar. Abra Eclipse y empezar un proyecto nuevo. Si necesita ayuda para configurar el entorno de desarrollo, el autor también ha creado un detallado paso a paso guía. Aquí hay un enlace.

Cómo configurar el entorno de desarrollo de Android:

Crear un nuevo proyecto
Proyecto: Garage Door App
Construir objetivo: He orientado Android 2.3.1, pero creo que el código se ejecutaría tan bajo como 1.6. Así que si su teléfono no sea inferior v2.3.1 seleccionar la API apropiada
Nombre de la aplicación: App Garage Door
Nombre del paquete: com.acm.blog.example.garagedoorapp
Seleccione “Crear actividad:” y el nombre “MainActivity”
Min versión SDK: 9 (de nuevo si la orientación es menor API ajustar este número al nivel de la API correspondiente)
.

Se compone de tres controles:

  • Un botón de la puerta del garaje abierta.
  • Un botón de la puerta del garaje cercano.
  • Y por último, un indicador de estado que nos permitirá saber si la puerta está abierta o cerrada. También programé, así que cuando se toca la pantalla gráfica de la aplicación comprobará la puerta y actualizar el estado.

 


Paso 1: Crear el diseño mediante la edición del archivo main.xml ya creado para nosotros. Si Eres nuevo en Android el diseño puede ser un poco confuso. Aquí hay una explicación completa del archivo de diseño.

A partir de la línea 1 y terminando en la línea 19 es un “diseño lineal” que abarca todo el trazado. Se especifica que la orientación es vertical. Como los nuevos controles se añaden aparecen en la parte inferior. También establecemos el fondo de nuestro aluminio pulido gráfico.
Líneas 2-4 son un diseño lineal con un TextView para “Garage Door Opener”. Envolví el TextView en una disposición lineal, de modo que pude centro con android: Gravedad = “center_horizontal”
He utilizado un diseño de marcos en las líneas 5-12 para que yo pueda controles de capa en la parte superior de uno al otro. Yo quería que la barra de progreso para ser el punto muerto de nuestra condición gráfico.
Líneas 6-8 es nuestro gráfico de estado que se centra en la propiedad android: Gravedad = “center_horizontal”
Líneas 9-11 es la barra de progreso que mostramos al hacer nuestras llamadas de servicio web en un subproceso en segundo plano. También centrada.
Líneas 13-18 es una disposición lineal (fuera del marco de lo que aparece por debajo de ella). Esta disposición lineal se ajusta a apilar los controles horizontalmente con la siguiente propiedad android: orientation = “horizontal”. Tenemos dos botones de imagen en este diseño.

Main.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<linearlayout android:background="@drawable/background" android:layout_height="fill_parent" android:layout_width="fill_parent" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android">
  <linearlayout android:gravity="center_horizontal" android:layout_height="wrap_content" android:layout_width="fill_parent" android:orientation="horizontal">
   <textview android:id="@+id/textView1" android:layout_height="wrap_content" android:layout_width="wrap_content" android:paddingtop="4dip" android:text="Garage Door Opener" android:textcolor="#cc6600" android:textsize="20dip"></textview>
  </linearlayout>
  <framelayout android:gravity="center_horizontal" android:layout_height="wrap_content" android:layout_width="fill_parent" android:orientation="horizontal" android:paddingtop="35dip">
   <linearlayout android:gravity="center_horizontal" android:layout_height="wrap_content" android:layout_width="fill_parent" android:orientation="horizontal" android:paddingtop="35dip">
    <imageview android:gravity="center_horizontal" android:id="@+id/Status_ImageView" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/status_unknown"></imageview>
   </linearlayout>
   <linearlayout android:gravity="center_horizontal" android:layout_height="wrap_content" android:layout_width="fill_parent" android:orientation="horizontal" android:paddingtop="80dip">
    <progressbar android:id="@+id/progressBar1" android:layout_height="wrap_content" android:layout_width="wrap_content" android:visibility="invisible"></progressbar>
   </linearlayout>
  </framelayout>
  <linearlayout android:gravity="center_horizontal" android:layout_height="wrap_content" android:layout_width="fill_parent" android:orientation="horizontal" android:paddingtop="80dip">
    <imagebutton android:background="#00000000" android:contentdescription="info" android:id="@+id/OpenButton" android:layout_height="wrap_content" android:layout_width="wrap_content" android:paddingright="10dip" android:src="@drawable/open_button" android:tag="dooclosed">
     </imagebutton>
    <imagebutton android:background="#00000000" android:contentdescription="info" android:id="@+id/CloseButton" android:layout_height="wrap_content" android:layout_width="wrap_content" android:paddingright="10dip" android:src="@drawable/close_button">
     </imagebutton>
  </linearlayout>
</linearlayout>
 

 

Paso 2: Antes de que codificamos nuestra actividad vamos a crear una clase de ayuda para hacer las llamadas HTTP al Netduino.
Haga clic derecho sobre el nombre del proyecto y seleccione New> Class
El nombre de “WebService.java”. Ahora vamos a ir a través del código.
La línea 2 se hará una constante de cadena que contiene la dirección IP Netduino

1
2
3
4
public class WebService {
 private final String WEBSERVICE_URL = "http://192.168.0.153/";
  ...
  ...
  • La línea 3 declara una HttpClient vamos a utilizar para hacer las llamadas HTTP
1
2
3
4
public class WebService {
 private final String WEBSERVICE_URL = "http://192.168.0.153/";
 private HttpClient client;
 ...
  • Crear un constructor y en ella una instancia nuestra HttpClient
2
3
4
5
6
...
    public WebService(){
        client = new DefaultHttpClient();
    }
  ...
  • Crear un método privado que llama al servicio web y analiza le vuelta
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
private String MakeHTTPCall(String method){
  HttpGet get = new HttpGet(WEBSERVICE_URL + method);
  try {
   // Create a response handler
            ResponseHandler<string> responseHandler = new BasicResponseHandler();
            String responseBody = client.execute(get, responseHandler);
            return responseBody;
  } catch (IOException e) {       // -|
   e.printStackTrace();       // |--> Oops something went wrong!
  } catch (Exception e) {        // |
   e.printStackTrace();       // -|
  }
  return "failed";         //Return "failed" if we encounter an error
 }
</string>
  • Crear una nueva HTTP GET que pasa en la URL del servicio web y el nombre del método
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
private String MakeHTTPCall(String method){
  HttpGet get = new HttpGet(WEBSERVICE_URL + method);
  try {
   // Create a response handler
            ResponseHandler<string> responseHandler = new BasicResponseHandler();
            String responseBody = client.execute(get, responseHandler);
            return responseBody;
  } catch (IOException e) {       // -|
   e.printStackTrace();       // |--> Oops something went wrong!
  } catch (Exception e) {        // |
   e.printStackTrace();       // -|
  }
  return "failed";         //Return "failed" if we encounter an error
 }
</string>
  • Instantiate a new BasicResponseHandler to parse our webservice return into a string
  • Create a String variable to hold the return and call execute on the HttpClient
  • We pass in the HttpGet variable and the response handler
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
private String MakeHTTPCall(String method){
  HttpGet get = new HttpGet(WEBSERVICE_URL + method);
  try {
   // Create a response handler
            ResponseHandler<string> responseHandler = new BasicResponseHandler();
            String responseBody = client.execute(get, responseHandler);
            return responseBody;
  } catch (IOException e) {       // -|
   e.printStackTrace();       // |--> Oops something went wrong!
  } catch (Exception e) {        // |
   e.printStackTrace();       // -|
  }
  return "failed";         //Return "failed" if we encounter an error
 }
</string>
  • Devolver el resultado de la llamada HTTP GET. Nos envolvemos la llamada HTTP en tratar captura.
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
private String MakeHTTPCall(String method){
  HttpGet get = new HttpGet(WEBSERVICE_URL + method);
  try {
   // Create a response handler
            ResponseHandler<string> responseHandler = new BasicResponseHandler();
            String responseBody = client.execute(get, responseHandler);
            return responseBody;
  } catch (IOException e) {       // -|
   e.printStackTrace();       // |--> Oops something went wrong!
  } catch (Exception e) {        // |
   e.printStackTrace();       // -|
  }
  return "failed";         //Return "failed" if we encounter an error
 }
</string>
WebService.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public class WebService {
 private final String WEBSERVICE_URL = "http://192.168.0.153/";
 private HttpClient client;
    public WebService(){
        client = new DefaultHttpClient();
    }
    public String IsGarageDoorOpen(){
     for(int i = 0; i < 5; i++){
         String s = MakeHTTPCall("checkdoor");
      if(s.equals("failed") == false)
       return s; //Got a response return result
     }
     return "failed"//Oh well we tried 5 times without success
 }
 public String ActivateGarageDoor(){
  for(int i=0; i < 5; i++){
   String s = MakeHTTPCall("activatedoor");
      if(s.equals("failed") == false)
       return s; //Got a response return result
  }
  return "failed";
 }
 
 private String MakeHTTPCall(String method){
  HttpGet get = new HttpGet(WEBSERVICE_URL + method);
  try {
   // Create a response handler
            ResponseHandler<string> responseHandler = new BasicResponseHandler();
            String responseBody = client.execute(get, responseHandler);
            return responseBody;
  } catch (IOException e) {       // -|
   e.printStackTrace();       // |--> Oops something went wrong!
  } catch (Exception e) {        // |
   e.printStackTrace();       // -|
  }
  return "failed";         //Return "failed" if we encounter an error
 }
}
</string>

 

Paso 3: Vamos a editar nuestra actividad principal.
La línea 2 es nuestra barra de progreso le mostrará mientras comprobamos el estado de la puerta del garaje en un subproceso en segundo plano. Siempre es una buena idea para que el usuario sepa cuando la aplicación está funcionando en segundo plano.
La línea 3 es un ejemplo de nuestra ImageView vamos a utilizar para visualizar el estado de la puerta del garaje.
La línea 4 es una instancia de nuestra clase auxiliar de servicios web.

1
2
3
4
public class MainActivity extends Activity {
 private ProgressBar progressBar1;
 private ImageView status;
 private WebService ws;

Ahora vamos a añadir un poco de código al método onCreate

En la línea 9 pasamos de la barra de título de la ventana.
Línea 12 instanciar la barra de progreso.
Línea 13 del ImageView que estamos usando para visualizar el estado de la puerta del garaje.
Las líneas 14 a 19 establecen el on click oyente para que podamos comprobar el estado de la puerta del garaje cuando alguien toca la imagen de estado. Nos alguien hace clic en el ImageView ejecutamos un AsyncTask para comprobar la puerta del garaje en un subproceso en segundo plano.
Línea 20 instanciar nuestra ImageButton Abrir.
Las líneas 21 a 26 establecen el oyente haga clic en el botón Abrir. Cuando se hace clic en el botón de apertura activamos la puerta del garaje con una AsyncTask en un subproceso en segundo plano.
Líneas 27-33 es el mismo para el botón Cerrar.
Líneas 34-48 Creamos un Timer para comprobar el estado de la puerta del garaje cada quince minutos más en un subproceso en segundo plano.

@Override

 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
  setContentView(R.layout.main);
  ws = new WebService();
  progressBar1 = (ProgressBar) findViewById(R.id.progressBar1);
  status = (ImageView) findViewById(R.id.Status_ImageView);
  status.setOnClickListener(new OnClickListener() {     
     public void onClick(View v) {      // Check garage door
      new CheckGarageDoorAsync().execute();   // when status
                 // image clicked
     }
    });
  ImageButton openButton = (ImageButton) findViewById(R.id.OpenButton);
  openButton.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View arg0) {
    new ActivateGarageDoorAsync().execute();
   }
  });
  ImageButton closeButton = (ImageButton) findViewById(R.id.CloseButton);
  closeButton.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View arg0) {
    new ActivateGarageDoorAsync().execute();
   }
  });
  final Handler handler = new Handler();
  Timer t = new Timer();
  t.scheduleAtFixedRate(new TimerTask() {
   @Override
   public void run() {
    handler.post(new Runnable() {
     public void run() {
      Log.d("z", "check garage door");
      setUI(ws.IsGarageDoorOpen());
     }
    });
   }
  }, 0, 900000);
  new CheckGarageDoorAsync().execute();
 }
}

 líneas 56-92 es un método que establece nuestra interfaz de usuario en función del estado de la puerta del garaje. Si la puerta del garaje está abierta desactivamos el botón de apertura y ajuste la pantalla a “Abrir”, y por supuesto, si está cerrado el contrario.

56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
private void setUI(String mode) {
  if (mode.equals("Open")) {
   ImageButton o = (ImageButton) findViewById(R.id.OpenButton);
   o.setImageResource(R.drawable.open_button_alt); // Open button
               // depressed
   o.setEnabled(false);        // Disable open button
   ImageButton c = (ImageButton) findViewById(R.id.CloseButton);
   c.setImageResource(R.drawable.close_button);  // Closed button up
   c.setEnabled(true);        // Enable close button
   ImageView status = (ImageView) findViewById(R.id.Status_ImageView);
   status.setImageResource(R.drawable.status_open); // Set status
                // graphic
  } else if (mode.equals("Closed")) {
   ImageButton o = (ImageButton) findViewById(R.id.OpenButton);
   o.setImageResource(R.drawable.open_button);  // Open button up
   o.setEnabled(true);        // Enable open button
   ImageButton c = (ImageButton) findViewById(R.id.CloseButton);
   c.setImageResource(R.drawable.close_button_alt); // Close button
                // depressed
   c.setEnabled(false);         // Disable close button
   ImageView status = (ImageView) findViewById(R.id.Status_ImageView);
   status.setImageResource(R.drawable.status_closed);// Set status
                 // graphic
  } else {
   ImageButton o = (ImageButton) findViewById(R.id.OpenButton);
   o.setImageResource(R.drawable.open_button_alt);  // Open button
                // depressed
   o.setEnabled(false);         // Disable open button
   ImageButton c = (ImageButton) findViewById(R.id.CloseButton);
   c.setImageResource(R.drawable.close_button_alt); // Close button
                // depressed
   c.setEnabled(false);         // Disable close button
   ImageView status = (ImageView) findViewById(R.id.Status_ImageView);
   status.setImageResource(R.drawable.status_unknown);// Set status
                  // graphic
  }
 }
private void setUI(String mode) {
  if (mode.equals("Open")) {
   ImageButton o = (ImageButton) findViewById(R.id.OpenButton);
   o.setImageResource(R.drawable.open_button_alt); // Open button
               // depressed
   o.setEnabled(false);        // Disable open button
   ImageButton c = (ImageButton) findViewById(R.id.CloseButton);
   c.setImageResource(R.drawable.close_button);  // Closed button up
   c.setEnabled(true);        // Enable close button
   ImageView status = (ImageView) findViewById(R.id.Status_ImageView);
   status.setImageResource(R.drawable.status_open); // Set status
                // graphic
  } else if (mode.equals("Closed")) {
   ImageButton o = (ImageButton) findViewById(R.id.OpenButton);
   o.setImageResource(R.drawable.open_button);  // Open button up
   o.setEnabled(true);        // Enable open button
   ImageButton c = (ImageButton) findViewById(R.id.CloseButton);
   c.setImageResource(R.drawable.close_button_alt); // Close button
                // depressed
   c.setEnabled(false);         // Disable close button
   ImageView status = (ImageView) findViewById(R.id.Status_ImageView);
   status.setImageResource(R.drawable.status_closed);// Set status
                 // graphic
  } else {
   ImageButton o = (ImageButton) findViewById(R.id.OpenButton);
   o.setImageResource(R.drawable.open_button_alt);  // Open button
                // depressed
   o.setEnabled(false);         // Disable open button
   ImageButton c = (ImageButton) findViewById(R.id.CloseButton);
   c.setImageResource(R.drawable.close_button_alt); // Close button
                // depressed
   c.setEnabled(false);         // Disable close button
   ImageView status = (ImageView) findViewById(R.id.Status_ImageView);
   status.setImageResource(R.drawable.status_unknown);// Set status
                  // graphic
  }
 }

 

Líneas 97-117 Creamos un AsyncTask para comprobar el estado de la puerta del garaje. El uso de un AsyncTask permite el hacer una llamada http en un subproceso en segundo plano por lo que nuestra aplicación no se convierta en un-sensible y geneate un error “ANR”. Si se realiza una tarea de largo en el hilo de interfaz de usuario y el usuario pulsa una tecla y no hay respuesta dentro de 5 segundos Android generará un mensaje de error ANR solicita al usuario que esperar o para cerrar. Nunca se debe realizar una llamada de red en el subproceso de interfaz de usuario. Ponemos en práctica tres métodos de la AsyncTask.

OnPreExecute (). Esto se realiza en el subproceso de interfaz de usuario. Nos dirigimos en la barra de progreso que indica que estamos comprobando la puerta.
doInBackground (). Esto se lleva a cabo en un subproceso de fondo. En este método, comprobamos el estado de la puerta del garaje llamando a nuestro método IsGarageOpen en nuestra clase de servicio web. A continuación, pasamos los resultados de OnPostExecute () método.
OnPostExecute (). Esto se realiza en el subproceso de interfaz de usuario. Este método establece los controles basados ​​en el estado de la puerta del garaje.

97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
private class CheckGarageDoorAsync extends AsyncTask<void, string[]="" void,=""> {
  @Override
  protected void onPreExecute() {
   setUI("Unkown");            // While we check disable all buttons and clear status display
   progressBar1.setVisibility(View.VISIBLE); // Display progress bar
  }
 
  @Override
  protected String[] doInBackground(Void... arg0) {
   String r = ws.IsGarageDoorOpen();    // Make webservice call to check
              // garage door
   return new String[] { r };      // Return result
  }
 
  @Override
  protected void onPostExecute(String[] result) {
   progressBar1.setVisibility(View.INVISIBLE); // Hide progress bar
   setUI(result[0]);        // Pass result to setUI method to sync the UI
  }
 
 }
</void,>

 

Líneas 122-161 Creamos otra AsyncTask para activar la puerta del garaje. Aquí está la clase MainActivity completa.

MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
public class MainActivity extends Activity {
 private ProgressBar progressBar1;
 private ImageView status;
 private WebService ws;
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
  setContentView(R.layout.main);
  ws = new WebService();
  progressBar1 = (ProgressBar) findViewById(R.id.progressBar1);
  status = (ImageView) findViewById(R.id.Status_ImageView);
  status.setOnClickListener(new OnClickListener() {     
     public void onClick(View v) {      // Check garage door
      new CheckGarageDoorAsync().execute();   // when status
                 // image clicked
     }
    });
  ImageButton openButton = (ImageButton) findViewById(R.id.OpenButton);
  openButton.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View arg0) {
    new ActivateGarageDoorAsync().execute();
   }
  });
  ImageButton closeButton = (ImageButton) findViewById(R.id.CloseButton);
  closeButton.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View arg0) {
    new ActivateGarageDoorAsync().execute();
   }
  });
  final Handler handler = new Handler();
  Timer t = new Timer();
  t.scheduleAtFixedRate(new TimerTask() {
   @Override
   public void run() {
    handler.post(new Runnable() {
     public void run() {
      Log.d("z", "check garage door");
      setUI(ws.IsGarageDoorOpen());
     }
    });
   }
  }, 0, 900000);
  new CheckGarageDoorAsync().execute();
 }
 /*
  * Set UI components Garage Open Open button is disabled Close button is
  * enabled Status graphic - OPEN Garage Closed Open button is enabled Close
  * button is disabled Status graphic - Closed Garage Unknown Open button is
  * disabled Close button is disabled Status graphic - black
  */
 private void setUI(String mode) {
  if (mode.equals("Open")) {
   ImageButton o = (ImageButton) findViewById(R.id.OpenButton);
   o.setImageResource(R.drawable.open_button_alt); // Open button
               // depressed
   o.setEnabled(false);        // Disable open button
   ImageButton c = (ImageButton) findViewById(R.id.CloseButton);
   c.setImageResource(R.drawable.close_button);  // Closed button up
   c.setEnabled(true);        // Enable close button
   ImageView status = (ImageView) findViewById(R.id.Status_ImageView);
   status.setImageResource(R.drawable.status_open); // Set status
                // graphic
  } else if (mode.equals("Closed")) {
   ImageButton o = (ImageButton) findViewById(R.id.OpenButton);
   o.setImageResource(R.drawable.open_button);  // Open button up
   o.setEnabled(true);        // Enable open button
   ImageButton c = (ImageButton) findViewById(R.id.CloseButton);
   c.setImageResource(R.drawable.close_button_alt); // Close button
                // depressed
   c.setEnabled(false);         // Disable close button
   ImageView status = (ImageView) findViewById(R.id.Status_ImageView);
   status.setImageResource(R.drawable.status_closed);// Set status
                 // graphic
  } else {
   ImageButton o = (ImageButton) findViewById(R.id.OpenButton);
   o.setImageResource(R.drawable.open_button_alt);  // Open button
                // depressed
   o.setEnabled(false);         // Disable open button
   ImageButton c = (ImageButton) findViewById(R.id.CloseButton);
   c.setImageResource(R.drawable.close_button_alt); // Close button
                // depressed
   c.setEnabled(false);         // Disable close button
   ImageView status = (ImageView) findViewById(R.id.Status_ImageView);
   status.setImageResource(R.drawable.status_unknown);// Set status
                  // graphic
  }
 }
 /*
  * Check the garage door on background thread with an AsyncTask
  */
 private class CheckGarageDoorAsync extends AsyncTask<void, string[]="" void,=""> {
  @Override
  protected void onPreExecute() {
   setUI("Unkown");            // While we check disable all buttons and clear status display
   progressBar1.setVisibility(View.VISIBLE); // Display progress bar
  }
  @Override
  protected String[] doInBackground(Void... arg0) {
   String r = ws.IsGarageDoorOpen();    // Make webservice call to check
              // garage door
   return new String[] { r };      // Return result
  }
  @Override
  protected void onPostExecute(String[] result) {
   progressBar1.setVisibility(View.INVISIBLE); // Hide progress bar
   setUI(result[0]);        // Pass result to setUI method to sync the UI
  }
 }
 /*
  * Activate the garage door on a background thread with an AsyncTask
  */
 private class ActivateGarageDoorAsync extends
   AsyncTask<string, string,="" string[]=""> {
  @Override
  protected void onPreExecute() {
   setUI("Unkown");        // While we check disable all buttons and clear
              // display graphic
   progressBar1.setVisibility(View.VISIBLE); // Display progress bar
  }
  @Override
  protected String[] doInBackground(String... arg0) {
   String start = ws.IsGarageDoorOpen();
   String r = ws.ActivateGarageDoor();   // Activate garage door
   for (int i = 0; i < 60; i++) {     // Give the door up to 1 minute to
              // close/open
    try {
     Thread.sleep(1000);     // Pause for 1 second
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
    r = ws.IsGarageDoorOpen();     // Check the door status
    if (r.equals(start) == false && r.equals("failed") == false)
     break;         // The door is done opening/closing
   }
   return new String[] { r };      // Return the status of garage
  }
  @Override
  protected void onProgressUpdate(String... values) {
  }
  @Override
  protected void onPostExecute(String[] result) {
   progressBar1.setVisibility(View.INVISIBLE);
   setUI(result[0]);
  }
 }
}
</string,></void,>

 

Usted puede obtener todo el código fuente del proyecto aquí

Para aprender a construir el hardware necesario para supervisar y controlar la puerta del garaje leer el posot del propio autort aquí.

Fuente Greg Zimmers

Top Aplicaciones para PC ,tableta o móvil


Tan solo para Windows se calcula que hay más de cuatro millones de programas conocidos. A los que hay que añadir centenares de miles de apps para Mac, móviles, tabletas…

Las aplicaciones que impresionan son pocas. Las que dejan un surco indeleble en la memoria, menos todavía. Hablamos de apps que, bien por su originalidad, bien por su calidad, brillan con luz propia.

Vamos a presentarte una selección tanto para Escritorio Windows como para teléfonos móviles y navegadores web. ¿Estás listo para descubrir nuevos mundos? Sigue leyendo