2010-07-19 11 views
30

scannen Hallo, das klingt vielleicht wie eine dumme Frage.Aber ich konnte keine Antworten dafür finden, also hier posten.Wie man regelmäßig nach Bluetooth-Geräten auf Android

Ich baue eine Indoor-Anwendung, die kontinuierlich die Bluetooth-Dongles an verschiedenen Orten an einem Ort wie einem Einkaufszentrum oder einer Bibliothek scannt.Als ich mich in der Mall mit Android-Handy in meiner Hand bewegen, sollte ich in der Lage sein, den nächsten Dongle zu bekommen mit dem ich mich verbinden kann (Stupid Idea, aber ich möchte etwas anderes damit machen). Dafür sollte ich kontinuierlich nach den Bluetooth-Geräten suchen können.

Bitte kann mir jemand sagen, wie ich Android die verfügbaren Bluetooth-Geräte in regelmäßigen Abständen scannen.

+0

Es wunderbare Idee und fantastische Frage ist, ich Sie upvoting, Glücklich Coding :-) –

Antwort

18

Ich denke, das war so einfach, aber hat mich nicht vorher getroffen. Hier ist die Antwort,

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(); 
      } 

So sollten wir Entdeckung wieder auf ACTION_DISCOVERY_FINISHED beginnen, die kontinuierlich alle 12 Sekunden für Geräte scannen.

+1

Awesom Antwort Lieber, aber wird es don‘ t konsumieren die Battert zu viel? –

+0

Es funktioniert nicht mit mir :-( –

+8

Stellen Sie sicher, dass Sie den Empfänger registrieren 'IntentFilter intentFilter = neuer IntentFilter (BluetoothAdapter.ACTION_DISCOVERY_FINISHED); registerReceiver (myReceiver, intentFilter);' – Raytheon

2

Ihr Code-Snippet sollte funktionieren - Nur dass es in Bezug auf die Stromaufnahme teuer sein wird und Ihr Gerät/Telefon in einigen Stunden töten wird. Die startDiscovery() führt einen 2-stufigen Prozess durch, der das Gerät durchsucht und gefolgt von einer Namensfindung, dh Paging und Verbindung zum Gerät,

Leider stellt Android keine API zur Verfügung, um dies zu kontrollieren und nur Anfrage Es gibt auch eine periodische Abfragefunktion, die von den meisten Bluetooth-Chipsätzen definiert und unterstützt wird. Android verfügt derzeit über keine API, um regelmäßige Abfragen durchzuführen, die für Ihren Anwendungsfall besser geeignet gewesen wären.

9

Hier ist der Code die Liste aller Aktive Bluetooth-Geräte [Gekoppelte oder ungepaarten]

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); 
       } 
      } 
     } 
    }; 

} 

ich die Idee von API Demo bekommen zu bekommen, ich hoffe, dass dies für alle Entwickler nützlich sein könnte .

5

Wie in der documentation Geräteerkennung festgestellt, ist ein hoher Prozess, der die Leistung von Bindungen, die Sie mit anderen Geräten haben, direkt beeinträchtigen wird.

Vorsicht: Die Geräteerkennung ist eine schwere Prozedur für den Bluetooth-Adapter und verbraucht viele Ressourcen. Sobald Sie ein Gerät zum Herstellen einer Verbindung gefunden haben, stellen Sie sicher, dass Sie immer Discovery mit CancelDiscovery() beenden, bevor Sie eine Verbindung versuchen. Wenn Sie bereits eine Verbindung mit einem Gerät haben, kann die Erkennung die Bandbreite, die für die -Verbindung verfügbar ist, erheblich reduzieren. Daher sollten Sie die Erkennung nicht durchführen, solange eine Verbindung besteht.

In diesem Sinne (Fehler ausgelassen Abwicklung):

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(); 
       } 
      } 
}