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.