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

🤞 No se pierda nuestro boletín mensual !es gratis!

¡No hacemos spam! Más información en nuestra política de privacidad

0 comentarios en “Construccion de una app con Android que interactua con Netduino

Deja una respuesta