Descargar la presentación
La descarga está en progreso. Por favor, espere
Publicada porÁlvaro Olivera Belmonte Modificado hace 8 años
1
Desarrollo de aplicaciones Android Curso 13/14 Ejemplo de conectividad con bluetooth
2
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.
3
Desarrollo de aplicaciones Android 3 © Grupo Arco Paso 2 ● El Manifest debe contener los permisos de BLUETOOTH y BLUETOOTH_ADMIN <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.cep.bttest" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="19" /> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.cep.bttest" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="19" />
4
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
5
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
6
Desarrollo de aplicaciones Android 6 © Grupo Arco <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="@string/Text" /> Ejemplo <Button android:id="@+id/Encender" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/Buscando" />º <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginTop="30dp" >
7
Desarrollo de aplicaciones Android 7 © Grupo Arco <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="@string/Text" /> Ejemplo <Button android:id="@+id/Encender" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/Buscando" />º <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
8
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
9
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
10
Desarrollo de aplicaciones Android 10 © Grupo Arco Elementos a usar ● UUID: Universally Unique Identifier. Es un identificador único de 128 bits
11
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 { @Override 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(); }
12
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-8a39-12342009c666"); private void configureBluetooth() { bluetooth = BluetoothAdapter.getDefaultAdapter(); }
13
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); }
14
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()
15
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); } }); }
16
Desarrollo de aplicaciones Android 16 © Grupo Arco Paso 6: Llenar el método para hacerse visible(3) @Override 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 () { @Override protected BluetoothSocket doInBackground(Integer...params) { try { socket = btserver.accept(params[0]*1000); return socket; } catch (IOException e) { Log.d("BLUETOOTH", e.getMessage()); } return null; } @Override protected void onPostExecute(BluetoothSocket result) { if (result != null) switchUI(); } }; acceptThread.execute(resultCode); } catch (IOException e) { Log.d("BLUETOOTH", e.getMessage()); }}}}
17
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); }
18
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() { @Override 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(); } };
19
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(); } }); }
20
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
21
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 () { @Override 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; } @Override protected void onPostExecute(Void result) { switchUI(); } }; connectTask.execute(index); } });
22
Desarrollo de aplicaciones Android 22 © Grupo Arco Paso 9: Probar comunicación ● Ejecutar la aplicación usando dos dispositivos y probar
23
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(); }
24
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()); }
25
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); }
26
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()); }}}
Presentaciones similares
© 2025 SlidePlayer.es Inc.
All rights reserved.