Android – Bluetooth discovery no encuentra ningún dispositivo

Actualmente estoy trabajando en una pequeña aplicación para comenzar con los servicios que la API Bluetooth de Android puede proporcionar.

Editar -> Respuesta:

Parece que el problema se debió a los dispositivos específicos de Nexus 5. Parece que su receptor bluetooth no funciona bien. La solución siguiente debería funcionar para otros dispositivos

Observación:

  1. He leído la documentación aquí: http://developer.android.com/guide/topics/connectivity/bluetooth.html , así como el siguiente código fuente de este tutorial http://www.londatiga.net/it/programming / Android / how-to-programmatically-scan-or-discover-android-bluetooth-device / localizado en github bajo / lorensiuswlt / AndroBluetooth

  2. He terminado casi todas las características que me interesaron (como comprobar la existencia del adaptador, activar / desactivar el blueooth, consultar divisiones apareadas, configurar el adaptador que se pueda detectar).

Problema:

En realidad, no se encuentra ningún dispositivo cuando inicio el método .onDiscovery (), aunque los dispositivos se encuentran en Configuración / Bluetooth en mi Nexus 5.

Aquí es cómo lo manejo:

public class MainActivity extends AppCompatActivity { private BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); ... protected void onCreate(Bundle savedInstanceState) { IntentFilter filter = new IntentFilter(); filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); filter.addAction(BluetoothDevice.ACTION_FOUND); filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED); filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); registerReceiver(mReceiver, filter); } 

El filtro está funcionando bien en lo que puedo probar, es decir, ACTION_STATE_CHANGED (en la activación de bluetooth) y los dos ACTION_DISCOVERY _ ***.

El siguiente método se llama con éxito:

 public void onDiscovery(View view) { mBluetoothAdapter.startDiscovery(); } 

Y luego tengo mi receptor bluetooth:

 private final BroadcastReceiver mReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) { final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR); if (state == BluetoothAdapter.STATE_ON) { showToast("ACTION_STATE_CHANGED: STATE_ON"); } } else if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) { mDeviceList = new ArrayList<>(); showToast("ACTION_DISCOVERY_STARTED"); mProgressDlg.show(); } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action) && !bluetoothSwitchedOFF) { mProgressDlg.dismiss(); showToast("ACTION_DISCOVERY_FINISHED"); Intent newIntent = new Intent(MainActivity.this, DeviceListActivity.class); newIntent.putParcelableArrayListExtra("device.list", mDeviceList); startActivity(newIntent); } else if (BluetoothDevice.ACTION_FOUND.equals(action)) {// When discovery finds a device // Get the BluetoothDevice object from the Intent BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); mDeviceList.add(device); showToast("Device found = " + device.getName()); } } }; 

No tengo ninguna edición que sale el logcat y no noté ningún apuro durante la prueba que hice. El único problema es que no se descubre ningún dispositivo al final de la exploración, cuando hay muchos descubiertos disponibles.

Traté de no poner demasiado código para no inundar el tema. Pregúnteme si necesita más.

Gracias por leerme, y gracias de antemano por sus respuestas.

¿En qué versión de Android se ejecuta esto? Si es Android 6.x, creo que necesitas agregar el permiso ACCESS_COURSE_LOCATION a tu manifiesto. Por ejemplo:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

Tuve un problema similar y esto lo arregló para mí.

ACTUALIZACIÓN: Agregar documentación directamente de Google en esta página:

Para acceder a los identificadores de hardware de los dispositivos externos cercanos a través de exploraciones Bluetooth y Wi-Fi, su aplicación debe tener ahora los permisos ACCESS_FINE_LOCATION o ACCESS_COARSE_LOCATION

Un poco tarde para la fiesta, pero esto puede ser útil para otras personas.

Necesitas hacer dos cosas

  1. Añadir <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

O <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

A tu AndroidManifest.xml

  1. Asegúrese de que está solicitando el permiso en tiempo de ejecución, así como para dispositivos Android 6.0 mediante el uso de algo como esto

     int MY_PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION = 1; ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, MY_PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION); 

    Justo antes de mBluetoothAdapter.startDiscovery();

Si no realiza el paso 2, no podrá obtener ninguna información de identificador de hardware en el dispositivo con Android> = 6.0

ACTUALIZAR / EDITAR:
Ejemplo con la versión de Android y el diálogo de alerta como advertencia

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // Only ask for these permissions on runtime when running Android 6.0 or higher switch (ContextCompat.checkSelfPermission(getBaseContext(), Manifest.permission.ACCESS_COARSE_LOCATION)) { case PackageManager.PERMISSION_DENIED: ((TextView) new AlertDialog.Builder(this) .setTitle("Runtime Permissions up ahead") .setMessage(Html.fromHtml("<p>To find nearby bluetooth devices please click \"Allow\" on the runtime permissions popup.</p>" + "<p>For more info see <a href=\"http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-hardware-id\">here</a>.</p>")) .setNeutralButton("Okay", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if (ContextCompat.checkSelfPermission(getBaseContext(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(DeviceListActivity.this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_ACCESS_COARSE_LOCATION); } } }) .show() .findViewById(android.R.id.message)) .setMovementMethod(LinkMovementMethod.getInstance()); // Make the link clickable. Needs to be called after show(), in order to generate hyperlinks break; case PackageManager.PERMISSION_GRANTED: break; } } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.