2010-07-19 16 views
30

Hola, esto puede sonar como una pregunta estúpida. Pero no he podido encontrar ninguna respuesta para esto, publicando así aquí.Cómo buscar periódicamente dispositivos bluetooth en Android

Estoy construyendo una aplicación interior que escanea continuamente los dongles bluetooth ubicados en diferentes lugares en un lugar como un centro comercial o una biblioteca. Cuando me mueva en el centro comercial con el teléfono Android en la mano, debería poder obtener el dongle más cercano con el cual me puedo conectar (Stupid Idea pero quiero hacer algo más con esto) .Para esto, debería poder escanear continuamente los dispositivos bluetooth.

Por favor alguien me puede decir cómo hago que Android explore los dispositivos Bluetooth disponibles periódicamente.

+0

Se increíble idea y pregunta fantástica, te estoy Upvoting, feliz Codificación :-) –

Respuesta

18

Supongo que esto fue muy simple, pero no me llamó la atención. Aquí está la respuesta,

private BluetoothAdapter mBtAdapter; 
mBtAdapter.startDiscovery(); 

private final BroadcastReceiver mReceiver = new BroadcastReceiver() 
{ 
     @Override 
     public void onReceive(Context context, Intent intent) 
     { 
      String action = intent.getAction(); 

      // When discovery finds a device 
      if (BluetoothDevice.ACTION_FOUND.equals(action)) 
      { 
      //do something 
      } 

      else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) 
      { 
       Log.v(TAG,"Entered the Finished "); 
       mBtAdapter.startDiscovery(); 
      } 

Por lo tanto deberíamos empezar de nuevo el descubrimiento ACTION_DISCOVERY_FINISHED que explorar continuamente para dispositivos cada 12 segundos.

+1

respuesta Awesom Estimado, pero que don' ¿Consumir demasiado el battert? –

+0

No funciona conmigo :-( –

+8

Asegúrese de registrar el receptor 'IntentFilter intentFilter = new IntentFilter (BluetoothAdapter.ACTION_DISCOVERY_FINISHED); registerReceiver (myReceiver, intentFilter);' – Raytheon

2

Su fragmento de código debería funcionar, solo que será costoso en términos de consumo de energía y seguramente matará su dispositivo/teléfono en unas pocas horas. StartDiscovery() realiza un proceso de 2 pasos, busca el dispositivo buscándolo y le sigue un descubrimiento de nombre, es decir, paginación y conexión al dispositivo,

Desafortunadamente, Android no proporciona ninguna API para controlar esto y hacer solo consultas , también hay una función de consulta periódica definida y admitida por la mayoría de los conjuntos de chips de Bluetooth, Android actualmente no tiene ninguna API para hacer una consulta periódica que podría haber sido más ideal para su caso de uso.

9

Este es el código para obtener la lista de todos los dispositivos Bluetooth activos [emparejados o no emparejado]

import java.util.Set; 

import android.app.Activity; 
import android.bluetooth.BluetoothAdapter; 
import android.bluetooth.BluetoothDevice; 
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.View; 
import android.view.Window; 
import android.view.View.OnClickListener; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.AdapterView.OnItemClickListener; 

/** 
* This Activity appears as a dialog. It lists any paired devices and 
* devices detected in the area after discovery. When a device is chosen 
* by the user, the MAC address of the device is sent back to the parent 
* Activity in the result Intent. 
*/ 
public class DeviceListActivity extends Activity { 
    // Debugging 
    private static final String TAG = "DeviceListActivity"; 
    private static final boolean D = true; 

    // Return Intent extra 
    public static String EXTRA_DEVICE_ADDRESS = "device_address"; 

    // Member fields 
    private BluetoothAdapter mBtAdapter; 
    private ArrayAdapter<String> mPairedDevicesArrayAdapter; 
    private ArrayAdapter<String> mNewDevicesArrayAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // Setup the window 
     requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 
     setContentView(R.layout.activity_device_list); 


     // Initialize the button to perform device discovery 
     Button scanButton = (Button) findViewById(R.id.button_scan); 
     scanButton.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       doDiscovery(); 
       v.setVisibility(View.GONE); 
      } 
     }); 

     // Initialize array adapters. One for already paired devices and 
     // one for newly discovered devices 
     mPairedDevicesArrayAdapter = new ArrayAdapter<String>(this, R.layout.device_name); 
     mNewDevicesArrayAdapter = new ArrayAdapter<String>(this, R.layout.device_name); 

     // Find and set up the ListView for paired devices 
     ListView pairedListView = (ListView) findViewById(R.id.paired_devices); 
     pairedListView.setAdapter(mPairedDevicesArrayAdapter); 
     pairedListView.setOnItemClickListener(mDeviceClickListener); 

     // Find and set up the ListView for newly discovered devices 
     ListView newDevicesListView = (ListView) findViewById(R.id.new_devices); 
     newDevicesListView.setAdapter(mNewDevicesArrayAdapter); 
     newDevicesListView.setOnItemClickListener(mDeviceClickListener); 

     // Register for broadcasts when a device is discovered 
     IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); 
     this.registerReceiver(mReceiver, filter); 

     // Register for broadcasts when discovery has finished 
     filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); 
     this.registerReceiver(mReceiver, filter); 

     // Get the local Bluetooth adapter 
     mBtAdapter = BluetoothAdapter.getDefaultAdapter(); 

     // Get a set of currently paired devices 
     Set<BluetoothDevice> pairedDevices = mBtAdapter.getBondedDevices(); 

     // If there are paired devices, add each one to the ArrayAdapter 
     if (pairedDevices.size() > 0) { 
      findViewById(R.id.title_paired_devices).setVisibility(View.VISIBLE); 
      for (BluetoothDevice device : pairedDevices) { 
       mPairedDevicesArrayAdapter.add(device.getName() + "\n" + device.getAddress()); 
      } 
     } else { 
      String noDevices = getResources().getText(R.string.none_paired).toString(); 
      mPairedDevicesArrayAdapter.add(noDevices); 
     } 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 

     // Make sure we're not doing discovery anymore 
     if (mBtAdapter != null) { 
      mBtAdapter.cancelDiscovery(); 
     } 
     // Unregister broadcast listeners 
     this.unregisterReceiver(mReceiver); 
    } 

    /** 
    * Start device discover with the BluetoothAdapter 
    */ 
    private void doDiscovery() { 
     if (D) Log.d(TAG, "doDiscovery()"); 

     // Indicate scanning in the title 
     setProgressBarIndeterminateVisibility(true); 
     setTitle(R.string.scanning); 

     // Turn on sub-title for new devices 
     findViewById(R.id.title_new_devices).setVisibility(View.VISIBLE); 

     // If we're already discovering, stop it 
     if (mBtAdapter.isDiscovering()) { 
      mBtAdapter.cancelDiscovery(); 
     } 
     // Request discover from BluetoothAdapter 
     mBtAdapter.startDiscovery(); 
    } 

    // The on-click listener for all devices in the ListViews 
    private OnItemClickListener mDeviceClickListener = new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> av, View v, int i, long l) { 
      // Cancel discovery because it's costly and we're about to connect 
      mBtAdapter.cancelDiscovery(); 

      // Get the device MAC address, which is the last 17 chars in the View 
      String info = ((TextView) v).getText().toString(); 
      String address = info.substring(info.length() - 17); 


     } 
    }; 

    // The BroadcastReceiver that listens for discovered devices and 
    // changes the title when discovery is finished 
    private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 

      // When discovery finds a device 
      if (BluetoothDevice.ACTION_FOUND.equals(action)) { 
       // Get the BluetoothDevice object from the Intent 
       BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
       // If it's already paired, skip it, because it's been listed already 
       if (device.getBondState() != BluetoothDevice.BOND_BONDED) { 
        mNewDevicesArrayAdapter.add(device.getName() + "\n" + device.getAddress()); 
       } 
      // When discovery is finished, change the Activity title 
      } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { 
       setProgressBarIndeterminateVisibility(false); 
       setTitle(R.string.select_device); 
       if (mNewDevicesArrayAdapter.getCount() == 0) { 
        String noDevices = getResources().getText(R.string.none_found).toString(); 
        mNewDevicesArrayAdapter.add(noDevices); 
       } 
      } 
     } 
    }; 

} 

consigo la idea de la demostración de la API, espero que esto podría ser útil para todos los desarrolladores .

5

Como se indica en el dispositivo documentation el descubrimiento es un proceso elevado que degradará directamente el rendimiento de los enlaces que tenga con otros dispositivos.

Precaución: La detección del dispositivo es un procedimiento pesado para el adaptador Bluetooth y consumirá muchos de sus recursos. Una vez que haya encontrado un dispositivo para conectarse, asegúrese de detener siempre el descubrimiento con cancelDiscovery() antes de intentar una conexión. Además, si ya tiene una conexión con un dispositivo, realizar el descubrimiento puede reducir significativamente el ancho de banda disponible para la conexión , por lo que no debe realizar el descubrimiento mientras está conectado.

Con esto en mente (manejo de errores omite):

private final BroadcastReceiver deviceBroadcastReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 

      if (BluetoothDevice.ACTION_FOUND.equals(action)) { 
       deviceFound = true; 

       adapter.cancelDiscovery(); 

       //process new device. 

       deviceFound = false; 

       adapter.startDiscovery(); 
      } 
} 

private final BroadcastReceiver adapterBroadcastReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 

      if (BluetoothAdaptor.ACTION_DISCOVERY_FINISHED.equals(action)) { 
       if (deviceFound == false) { 
         adapter.startDiscovery(); 
       } 
      } 
} 
Cuestiones relacionadas