package com.tid.examples.bluetooth; import java.io.IOException; import java.util.UUID; import android.app.Activity; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothSocket; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import android.widget.TwoLineListItem; /** * Android Bluetooth Example * * Referencias: * * http://developer.android.com/guide/topics/wireless/bluetooth.html * http://developer.android.com/reference/android/bluetooth/BluetoothAdapter.html * * */ public class BluetoothActivity extends Activity { private static final String TAG = "BluetoothActivity"; //UUID generado aleatoriamente //Se usa tanto en el cliente como en el servidor private static final UUID APP_UUID = UUID.fromString("66b354c0-93c3-11e1-b0c4-0800200c9a66"); private static final int SUBACTIVITY_ENABLE_BT = 10; private BluetoothAdapter mBluetoothAdapter; private BtArrayAdapter mArrayAdapter; private BluetoothConnectionThread mThread; private Button mScanButton; private Button mStopButton; private TextView mScanning; private ListView mListView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mScanButton = (Button) findViewById(R.id.scan); mStopButton = (Button) findViewById(R.id.stop); mScanning = (TextView) findViewById(R.id.scanning); mListView = (ListView) findViewById(R.id.listview); //Listeners mScanButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { scan(); } }); mStopButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { cancel(); } }); mListView.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //Cancel discovery cancel(); //Conectar con el dispositivo BluetoothDevice device = mArrayAdapter.getItem(position); connect(device); } }); if (mArrayAdapter != null) mArrayAdapter.clear(); } @Override protected void onDestroy() { super.onDestroy(); if (mBluetoothReceiverRegistered) unregisterReceiver(mBluetoothReceiver); } //BUSCAR DISPOSITIVOS private void scan(){ //Instanciar el BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); //Comprobar if (mBluetoothAdapter == null) { Toast.makeText(BluetoothActivity.this, "ERROR: BluetoothAdapter could not be instantiated.", Toast.LENGTH_SHORT).show(); return; } //Si no está activado, damos la opción de activarlo (BluetoothAdapter.ACTION_REQUEST_ENABLE) if (!mBluetoothAdapter.isEnabled()) { Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, SUBACTIVITY_ENABLE_BT); } else { //Si lo está, empezamos a escanear IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); registerReceiver(mBluetoothReceiver, filter); mBluetoothReceiverRegistered = true; mArrayAdapter = new BtArrayAdapter(this, android.R.layout.simple_list_item_2); mScanning.setVisibility(View.VISIBLE); //Start discovery mBluetoothAdapter.startDiscovery(); } } private void cancel(){ //Cancel discovery if (mBluetoothAdapter != null) mBluetoothAdapter.cancelDiscovery(); mScanning.setVisibility(View.GONE); } //ArrayAdapter para mostrar una lista private final class BtArrayAdapter extends ArrayAdapter<BluetoothDevice>{ public BtArrayAdapter(Context context, int textViewResourceId) { super(context, textViewResourceId); } @Override public View getView(int position, View convertView, ViewGroup parent) { TwoLineListItem view; if (convertView == null){ LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = (TwoLineListItem) inflater.inflate(android.R.layout.simple_expandable_list_item_2, null); } else { view = (TwoLineListItem) convertView; } //Obtenemos el nombre y la direccion mac String name = mArrayAdapter.getItem(position).getName(); String mac = mArrayAdapter.getItem(position).getAddress(); if (name != null && name.trim().length() != 0) view.getText1().setText(name); else view.getText1().setText("<" + getResources().getString(R.string.unknown) + ">"); view.getText2().setText(mac); return view; } } //BroadcastReceiver para recibir los datos del bluetooth private final BroadcastReceiver mBluetoothReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (BluetoothDevice.ACTION_FOUND.equals(action)) { BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); Log.i(TAG, "Dispositivo: " + device.getName() + " " + device.getAddress()); mArrayAdapter.add(device); mListView.setAdapter(mArrayAdapter); } } }; private boolean mBluetoothReceiverRegistered = false; // CONECTAR CON DISPOSITIVOS private void connect(BluetoothDevice device){ //Toast.makeText(this, "Connecting to " + device.getName(), Toast.LENGTH_SHORT).show(); mThread = new BluetoothConnectionThread(device); mThread.start(); } // Thread para conectar private class BluetoothConnectionThread extends Thread { private final BluetoothSocket mSocket; private final BluetoothDevice mDevice; public BluetoothConnectionThread(BluetoothDevice device) { BluetoothSocket tmp = null; mDevice = device; //Usamos la llamada createRfcommSocketToServiceRecord para obtener el BluetoothSocket try { Log.i(TAG, "Creando socket "); tmp = device.createRfcommSocketToServiceRecord(APP_UUID); } catch (IOException e) { Log.i(TAG, "No se pudo conectar"); } mSocket = tmp; Log.i(TAG, "BluetoothSocket creado con dispositivo " + mDevice.getName()); Toast.makeText(BluetoothActivity.this, "BluetoothSocket creado", Toast.LENGTH_SHORT).show(); } public void run() { // Parar la busqueda Log.i(TAG, "BluetoothSocket creado"); mBluetoothAdapter.cancelDiscovery(); try { //Conectar Log.i(TAG, "Conectando socket"); mSocket.connect(); Log.i(TAG, "BluetoothSocket conectado con dispositivo " + mDevice.getName()); } catch (IOException connectException) { try { mSocket.close(); } catch (IOException closeException) { Log.i(TAG, "No se pudo conectar"); Toast.makeText(BluetoothActivity.this, "No se pudo conectar", Toast.LENGTH_SHORT).show(); } return; } //Una vez que tenemos el socket podemos trabajar con el //... //... } /** Will cancel an in-progress connection, and close the socket */ public void cancel() { try { mSocket.close(); } catch (IOException e) { } } } }