volver vincular studio scanner recibir puedo porque para libreria dispositivos dispositivo detectar datos como buscar app android bluetooth discovery

android - studio - porque no puedo vincular mi bluetooth



Cómo buscar periódicamente dispositivos bluetooth en Android (4)

Hola, esto puede sonar como una pregunta estúpida. Pero no pude encontrar ninguna respuesta para esto, por lo tanto publicar aquí.

Estoy creando 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 muevo en el centro comercial con un teléfono Android en la mano, debería poder obtener el dongle más cercano que puedo conectar. a (Idea estúpida, pero quiero hacer algo más con esto). Para esto debería poder buscar continuamente los dispositivos Bluetooth.

Por favor, ¿alguien puede decirme cómo hago que Android explore periódicamente los dispositivos Bluetooth disponibles?


Aquí está el código para obtener la lista de todos los dispositivos Bluetooth activos [emparejados o no emparejados]

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

Recibo la idea de la demostración de API, espero que esto pueda ser útil para todos los desarrolladores.


Como se indica en la documentation , el descubrimiento de dispositivos es un proceso elevado que degradará directamente el rendimiento de cualquier vínculo que tenga con otros dispositivos.

Precaución: realizar descubrimiento de 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 (se omite el manejo de errores):

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


Su fragmento de código debería funcionar. Solo que será costoso en términos de consumo de energía y que matará a su dispositivo / teléfono en pocas horas. StartDiscovery () realiza un proceso de 2 pasos, busca el dispositivo indagando y seguido de un descubrimiento de nombre, es decir, busca y conecta al dispositivo,

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


Supongo que esto fue tan simple, pero no me había golpeado antes. 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 comenzar de nuevo el descubrimiento en ACTION_DISCOVERY_FINISHED que buscará continuamente los dispositivos cada 12 segundos.