Desarrollo de aplicaciones Android Curso 13/14 Ejemplo de conectividad con bluetooth.

Slides:



Advertisements
Presentaciones similares
Curso de java básico (scjp)
Advertisements

Java nos ofrece System.out para escribir en pantalla, pero también tenemos System.in para leer. System.in es un objeto de una clase de java que se llama.
“GUI para Conexiones y Transferencia de Datos Seguros”
310 Diálogos de alerta. Un diálogo es una pequeña ventana que pide al usuario que tome una decisión o introduzca información adicional. Un diálogo no.
Manejo de excepciones en Java
Tema 7: Polimorfismo Antonio J. Sierra. Índice Introducción. Sobrecarga de métodos. Objetos como parámetros. Paso de argumentos. Devolución de objetos.
CONCEPTES AVANÇATS DE SISTEMES OPERATIUS Departament d’Arquitectura de Computadors (Seminaris de CASO) Autors Christophe Fontano Julien Alagnou Socket.
Inicio Java: Algunas utilidades. Inicio Temporización En ingeniería nos encontramos con tareas que deben repetirse de forma periódica. Son tareas temporizadas.
1 TEMA 5. Seguridad en Java 1.Introducción a los Controladores de Seguridad 2.Decidir qué Métodos Sobreescribir del SecurityManager 3.Escribir un Controlador.
Sockets en Java. Sockets ● Para programar aplicaciones en red en Java se utilizan los Sockets. ● Un socket permite establecer y manejar una conexión entre.
SCJP SUN CERTIFIED PROGRAMMER FOR JAVA 6. SEMANA TRES ASIGNACION.
Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza
Java. Java nació el año 1991, por un par de ingenieros de la Sun Microsystems.
Capítulo 5 - b: Hilos. 4.2 Silberschatz, Galvin and Gagne ©2005 Operating System Concepts – 7 th edition, Jan 23, 2005 Ejemplo de hilos: un applet Un.
“Android – Manejo de Eventos”
1 Manejo de Excepciones y otros Agustín J. González ELO-329.
User Datagram Protocol UDP Juan Pablo Araneda Danilo Araya Z.
Ing. Esp. Ricardo Cujar.  Lenguaje de programación orientado a objetos.  Desarrollado por Sun MicroSystems.  Independiente del Sistema Operativo gracias.
Metodología de Programación Ayudantía 4 lelagos.ublog.cl 2009.
1 Introducción a las Comunicaciones en Red. import java.net.InetAddress; import java.net.UnknownHostException; public class PruebaSockets { public static.
Trabajar con SERVLETS. Índice Qué son los Servlets Para qué sirven Cómo se utilizan Ejemplo Cómo probar un Servlet.
Aplicación con Angular, Ionic y PHP Por: Luis Salvador.
Java RMI. Entornos orientados a objetos  Tendencia actual hacia sistemas compuestos por un conjunto de objetos que interactúan entre sí.  Un programa.
Clases y Objetos en Java
Taller de Java Universidad de los Andes
Manejo de Excepciones Agustín J. González ELO329 ELO329.
Como utilizar la herramienta Visual Basic 2008 Express Edition
Iniciación a Android Cándido Caballero-Gil Doctor en Informática
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
Diseño y Programación Orientada a Objetos
Herencia y Clases Abstractas
Fundamentos de la programación orientada a objetos
Introducción a Base de Datos
Exception Object Throwable Error Exception Runtime Exception.
Clases y Objetos en Java
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
Ubicacion de ejemplos C:\Users\LuisRafael\Documents\Visual Studio 2013\Projects\PrintDocument.
Diseño y Programación Orientada a Objetos
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
Diseño y Programación Orientada a Objetos
Clases y Objetos en Java
Estructuras de datos y algoritmos
Listas Dinámicas.
Herencia en C#.
DOCENTE: EMILIO ISMAEL BUSTAMANTE MONTES
FLUJOS (Flujos de Bytes-Caracteres)
Aplicaciones de RECURSIVIDAD
Conceptos básicos de.NET Explorar el entorno de desarrollo Crear un proyecto Visual Basic.NET Use Visual Studio.NET Acceso a datos Depurar e implantar.
“Android – Distribución de Componentes”
“Android – Manejo de Eventos”
“Android – Componentes Básicos de la Interface”
Como sumar dos números con JavaScript
Instalación TruePort para Windows
“Android – Entrada y Procesamiento de Datos”
Árboles Binarios Estructuras de Datos.
Manejo de Excepciones Agustín J. González ELO329 ELO329.
Cliente Servidor.
String, random y stream en java
Casos de prueba con JUnit
“Android – Gráficos” Rogelio Ferreira Escutia.
Objetos con linea de ejecucion propia
public class T extends Thread { private Socket s; public T(Socket x){s=x;} public void run(){try{ //escuchar al cliente BR in=new BR(new ISR(s.getInputStream()));
Árboles Binarios Estructuras de Datos. Las estructuras dinámicas son las en la ejecución varia el número de elementos y uso de memoria a lo largo del.
1. CONEXIÓN DE JAVA CON MYSQL ING. JOSÉ VÉLIZ. PASO NO. 1 Después de creada la base de datos debemos ingresar a la aplicación Java y crear un nuevo proyecto,
public class T extends Thread { private Socket s; public T(Socket x){s=x;} public void run(){try{ //escuchar al cliente BR in=new BR(new ISR(s.getInputStream()));
SISTEMAS OPERATIVOS JOSE ANGEL MORENO B. Ingeniero de Sistemas TP # Copnia Universidad Incca de Colombia CORPORACI Ó N UNIVERSITARIA REMINGTON.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
Manejo de Excepciones y otros
Clases abstractas e interfaces
Clases y Objetos en Java
Transcripción de la presentación:

Desarrollo de aplicaciones Android Curso 13/14 Ejemplo de conectividad con bluetooth

Desarrollo de aplicaciones Android 2 © Grupo Arco Conectividad con Bluetooth: Paso 1 ● Creación de una aplicación vacía, basada en el hola mundo, la llamamos BTTest ● Nota, este ejemplo no puede ser ejecutado en el emulador y se necesitan dos dispositivos con BT.

Desarrollo de aplicaciones Android 3 © Grupo Arco Paso 2 ● El Manifest debe contener los permisos de BLUETOOTH y BLUETOOTH_ADMIN <manifest xmlns:android=" package="com.cep.bttest" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="19" /> <manifest xmlns:android=" package="com.cep.bttest" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="19" />

Desarrollo de aplicaciones Android 4 © Grupo Arco Paso 3: Creación del layout de la MainActivity Pondremos 2 botones, uno para hacerse visible y otro para buscar dispositivos cercanos. Pondremos un TextView para indicar el estado de conección. Para mostrar los dispositivos vinculados pondremos una ListView por encima de los botones. Incluiremos controles TextView y EditText para leer y escribir mensajes a través de la conexión. Para ello editamos el res/layout/activity_main.xml

Desarrollo de aplicaciones Android 5 © Grupo Arco Primero ponemos el TextView en donde indicaremos el estado Luego abrimos un LinearLayout para disponer los dos botones. La disposición de los botones en el layout la haremos horizontales (Buscando dispositivos y Hacerse visible), usando android.orientation=“horizontal” Y los otros dos controles listView y textView usando un nuevo LinearLayout con orientación vertical

Desarrollo de aplicaciones Android 6 © Grupo Arco <RelativeLayout xmlns:android=" xmlns:tools=" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" /> Ejemplo <Button android:layout_width="wrap_content" android:layout_height="wrap_content" />º <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginTop="30dp" >

Desarrollo de aplicaciones Android 7 © Grupo Arco <RelativeLayout xmlns:android=" xmlns:tools=" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" /> Ejemplo <Button android:layout_width="wrap_content" android:layout_height="wrap_content" />º <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginTop="30dp" > Especificar el texto en Res/Values/string.xml

Desarrollo de aplicaciones Android 8 © Grupo Arco Elementos a usar ● Adaptador de Bluetooth: Bluetooh Adapter: permite iniciar el descubrimiento de dispositivos, preguntar por la lista de aparatos vinculados, instanciar un BluetoothDevice usando una dirección MAC y crear un Socket (BluetoothServerSocket) para hacerse visible y escuchar el pedido de conexión de otros aparatos. Para obtener un adaptador de BT usamos el método getDefaultAdapter() ● Creación dinámica: de forma programática

Desarrollo de aplicaciones Android 9 © Grupo Arco Elementos a usar ● BluetoothDevice: Es una clase pública que representa a un dispositivo Bluetooth remoto. Permite crear una conexión con el dispositivo o pedir información del mismo como nombre, dirección,etc. ● BluetoothSocket: Un socket para conectar bluetooth Del lado del servidor usar BluetoothServerSocket para crear un socket server que escucha por pedidos de conexión. Cuando éste acepta retorna un nuevo socket BluetoothSocket para controlar la conexión. Del lado del cliente, éste usa un socket BluetoothSocket para ambas cosas, iniciar y controlar la conexión ● Creación dinámica: de forma programática

Desarrollo de aplicaciones Android 10 © Grupo Arco Elementos a usar ● UUID: Universally Unique Identifier. Es un identificador único de 128 bits

Desarrollo de aplicaciones Android 11 © Grupo Arco Paso 4: codificar la aplicación ● En el bttest activity hacer una llamada a una colección de sub métodos que serán usados para acceder a los dispositivos bluetooth. public class Bttest extends Activity public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Obtener el Bluetooth Adapter configureBluetooth(); // Configurar la ListView de dispositivos descubiertos setupListView(); // Configurar el botón de búsqueda de dispositivos setupSearchButton(); // Configurar el botón de hacerse visible setupListenButton(); }

Desarrollo de aplicaciones Android 12 © Grupo Arco Paso 4: codificar la aplicación (2) ● Llenar el submétodo configureBluetooth() para tener acceso al adaptador local. Crear una variable socket para almacenar socket de comunicación del cliente o del servidor una vez que la comunicación ha sido establecida. Definir un UUID para su aplicación private BluetoothAdapter bluetooth; private BluetoothSocket socket; private UUID uuid = UUID.fromString("a60f35f0-b93a-11de-8a c666"); private void configureBluetooth() { bluetooth = BluetoothAdapter.getDefaultAdapter(); }

Desarrollo de aplicaciones Android 13 © Grupo Arco Paso 5: Crear un método SwitchUI ● Este método será llamado cuando la comunicación esté establecida para habilitar la lectura y escritura de mensajes private void switchUI() { final TextView messageText = (TextView)findViewById(R.id.text_messages); final EditText textEntry = (EditText)findViewById(R.id.text_message); messageText.setVisibility(View.VISIBLE); list.setVisibility(View.GONE); textEntry.setEnabled(true); }

Desarrollo de aplicaciones Android 14 © Grupo Arco Paso 6: Llenar el método para hacerse visible ● Este método hace visible al dispositivo local para que sea descubierto durante un tiempo. Abre un BluetoothServerSocket para escuchar los pedidos de conexión de los dispositivos remotos. Cuando la conexión se hace llama al método SwitchUI()

Desarrollo de aplicaciones Android 15 © Grupo Arco Paso 6: Llenar el método para hacerse visible(2) private static int DISCOVERY_REQUEST = 1; private void setupListenButton() { Button listenButton = (Button)findViewById(R.id.button_listen); listenButton.setOnClickListener(new OnClickListener() { public void onClick(View view) { Intent disc; disc = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); startActivityForResult(disc, DISCOVERY_REQUEST); } }); }

Desarrollo de aplicaciones Android 16 © Grupo Arco Paso 6: Llenar el método para hacerse protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == DISCOVERY_REQUEST) { boolean isDiscoverable = resultCode > 0; if (isDiscoverable) { String name = "bluetoothserver"; try { final BluetoothServerSocket btserver = bluetooth.listenUsingRfcommWithServiceRecord(name, uuid); AsyncTask acceptThread = new AsyncTask () protected BluetoothSocket doInBackground(Integer...params) { try { socket = btserver.accept(params[0]*1000); return socket; } catch (IOException e) { Log.d("BLUETOOTH", e.getMessage()); } return null; protected void onPostExecute(BluetoothSocket result) { if (result != null) switchUI(); } }; acceptThread.execute(resultCode); } catch (IOException e) { Log.d("BLUETOOTH", e.getMessage()); }}}}

Desarrollo de aplicaciones Android 17 © Grupo Arco Paso 7: Código de conexión lado cliente ● Creamos una variable para almacenar el arrayList de dispositivos encontrados private ArrayList foundDevices; ● Llenamos el método SetupListView private ArrayAdapter aa; private ListView list; private void setupListView() { //Inicializamos el arraylist if(foundDevices == null) foundDevices = new ArrayList (); aa = new ArrayAdapter (this, android.R.layout.simple_list_item_1,foundDevices); list = (ListView)findViewById(R.id.list_discovered); list.setAdapter(aa); }

Desarrollo de aplicaciones Android 18 © Grupo Arco Paso 7: Código de conexión lado cliente ● Creamos un BroadcastReceiver que agrega cada dispositivo encontrado al arrayList creado en el paso anterior BroadcastReceiver discoveryResult = new BroadcastReceiver() public void onReceive(Context context, Intent intent) { BluetoothDevice remoteDevice; remoteDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); if (bluetooth.getBondedDevices().contains(remoteDevice)) { foundDevices.add(remoteDevice); aa.notifyDataSetChanged(); } };

Desarrollo de aplicaciones Android 19 © Grupo Arco Paso 7: Código de conexión lado cliente ● Completamos el método de búsqueda de dispositivos para iniciar la sesión de búsqueda private void setupSearchButton() { Button searchButton = (Button)findViewById(R.id.button_search); searchButton.setOnClickListener(new OnClickListener() { public void onClick(View view) { registerReceiver(discoveryResult, new IntentFilter(BluetoothDevice.ACTION_FOUND)); if (!bluetooth.isDiscovering()) { foundDevices.clear(); bluetooth.startDiscovery(); } }); }

Desarrollo de aplicaciones Android 20 © Grupo Arco Paso 8: Extender el método SetupListView (p.18) ● Agregamos un onItemClickListener para iniciar una conexión del lado del cliente con el dispositivo seleccionado. Una vez realizada la conexión llama al método SwithUI

Desarrollo de aplicaciones Android 21 © Grupo Arco Paso 8: Extender el método SetupListView (p.18) ● Luego de list.setAdapter(aa) agregar list.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView arg0, View view, int index, long arg3) { AsyncTask connectTask = new AsyncTask () protected Void doInBackground(Integer...params) { try { BluetoothDevice device = foundDevices.get(params[0]); socket = device.createRfcommSocketToServiceRecord(uuid); socket.connect(); } catch (IOException e) { Log.d("BLUETOOTH_CLIENT", e.getMessage()); } return null; protected void onPostExecute(Void result) { switchUI(); } }; connectTask.execute(index); } });

Desarrollo de aplicaciones Android 22 © Grupo Arco Paso 9: Probar comunicación ● Ejecutar la aplicación usando dos dispositivos y probar

Desarrollo de aplicaciones Android 23 © Grupo Arco Paso 10: Intercambiando mensajes private void switchUI() { final TextView messageText = (TextView)findViewById(R.id.text_messages); final EditText textEntry = (EditText)findViewById(R.id.text_message); messageText.setVisibility(View.VISIBLE); list.setVisibility(View.GONE); textEntry.setEnabled(true); textEntry.setOnKeyListener(new OnKeyListener() { public boolean onKey(View view, int keyCode, KeyEvent keyEvent) { if ((keyEvent.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_DPAD_CENTER)) { sendMessage(socket, textEntry.getText().toString()); textEntry.setText(""); return true; } return false; } }); BluetoothSocketListener bsl = new BluetoothSocketListener(socket, handler, messageText); Thread messageListener = new Thread(bsl); messageListener.start(); }

Desarrollo de aplicaciones Android 24 © Grupo Arco Paso 10: Intercambiando mensajes private void sendMessage(BluetoothSocket socket, String msg) { OutputStream outStream; try { outStream = socket.getOutputStream(); byte[] byteString = (msg + " ").getBytes(); int[] stringAsBytes = null; stringAsBytes[byteString.length - 1] = 0; outStream.write(byteString); } catch (IOException e) { Log.d("BLUETOOTH_COMMS", e.getMessage()); }

Desarrollo de aplicaciones Android 25 © Grupo Arco Paso 10: Intercambiando mensajes private class MessagePoster implements Runnable { private TextView textView; private String message; public MessagePoster(TextView textView, String message) { this.textView = textView; this.message = message; } public void run() { textView.setText(message); }

Desarrollo de aplicaciones Android 26 © Grupo Arco Paso 10: Intercambiando mensajes private class BluetoothSocketListener implements Runnable { private BluetoothSocket socket; private TextView textView; private Handler handler; public BluetoothSocketListener(BluetoothSocket socket, Handler handler, TextView textView) { this.socket = socket; this.textView = textView; this.handler = handler; } public void run() { int bufferSize = 1024; byte[] buffer = new byte[bufferSize]; try { InputStream instream = socket.getInputStream(); int bytesRead = -1; String message = ""; while (true) { message = ""; bytesRead = instream.read(buffer); if (bytesRead != -1) { while ((bytesRead==bufferSize)&&(buffer[bufferSize-1] != 0)) { message = message + new String(buffer, 0, bytesRead); bytesRead = instream.read(buffer); } message = message + new String(buffer, 0, bytesRead-1); handler.post(new MessagePoster(textView, message)); socket.getInputStream(); } } catch (IOException e) { Log.d("BLUETOOTH_COMMS", e.getMessage()); }}}