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:
- No se puede tener más de un receptor INSTALL_REFFERER en Android Manifest
- Androide. Iniciar aplicación desde Dialer
- Obteniendo nivel de batería en el widget android
- ResultReceiver.send sólo se puede llamar desde el mismo grupo de biblioteca
- ViewFlipper: Receptor no registrado
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:
-
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
-
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.
- Android: detecta cuándo se activa / desactiva el GPS (o cuando ya no se utiliza ninguna aplicación)
- Android DescargarManager get filename
- El envío de SMS mediante Intent no incluye destinatarios en algunos dispositivos
- Android en la facturación de la aplicación: Recepción onReceive nunca recibiendo llamadas incluso después de una compra exitosa
- cómo registrar un receptor para capturar la descarga completada?
- ACTION_HEADSET_PLUG demora de difusión
- Permiso del receptor de facturación en la aplicación
¿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
oACCESS_COARSE_LOCATION
Un poco tarde para la fiesta, pero esto puede ser útil para otras personas.
Necesitas hacer dos cosas
- 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
-
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; } }