write studio low example code ble android bluetooth-lowenergy android-bluetooth android-6.0-marshmallow

studio - bluetooth low energy example android



BluetoothLeScanner.startScan con Android 6.0 no descubre dispositivos (6)

¿Está su aplicación solicitando permiso de ubicación en el inicio? Si no lo está, maneja el código en otro lugar para que se te solicite.

También puedes verificar esto para probar si tu aplicación está funcionando bien:

Abra Configuración> Aplicaciones> Su aplicación> Permisos y habilite Ubicación y luego intente buscar resultados.

La ubicación se incluirá en los permisos solo si ha proporcionado ACCESS_COARSE_LOCATION en el manifiesto.

Estoy tratando de usar la función BluatoothLeScanner.startScan en lugar del desaprobado BluetoothAdapter.startLeScan . Ayer actualicé mi Nexus 5 a Android 6.0 y desde ese momento mi aplicación ya no funciona. Primero agrego las preferencias requeridas ACCESS_COARSE_LOCATION como se encuentra aquí, https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-hardware-id . Luego agregué el permiso como se describe aquí: https://developer.android.com/training/permissions/requesting.html . Pero al final parece que no funciona, no devuelve los dispositivos ble.

Este es mi código:

manifiesto

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.stm.sensitronapp"> <uses-sdk android:maxSdkVersion="23"/> <uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/> <uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>`

DeviceScanActivity

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... if (ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){ if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_COARSE_LOCATION)) { } else { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, MY_PERMISSIONS_REQUEST_ACCESS_COARSE); } } // Device scan callback. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { if (ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) { mScanCallback = new ScanCallback() { @Override public void onScanResult(int callbackType, ScanResult result) { super.onScanResult(callbackType, result); mLeDeviceListAdapter.addDevice(result.getDevice()); mLeDeviceListAdapter.notifyDataSetChanged(); } }; } } } final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); mBluetoothAdapter = bluetoothManager.getAdapter(); if (mBluetoothAdapter.getState() == BluetoothAdapter.STATE_ON) { mSwipeRefreshLayout.setRefreshing(true); mLeDeviceListAdapter.clear(); mBluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner(); if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION ) == PackageManager.PERMISSION_GRANTED) { mBluetoothLeScanner.startScan(mScanCallback); } }

EDITAR: para resolver este problema solo enciendo el GPS. Es fácil hacerlo programáticamente de esta manera .


El uso de las soluciones proporcionadas anteriormente funciona, pero el efecto secundario es que debe tener los servicios de ubicación activados para algo que no lo necesita. Una solución fea e insatisfactoria es especificar la versión de destino en su manifiesto para

android: targetSdkVersion = "21"

Permite escanear en mi Nexus 7 a pesar de que la versión instalada es 6.0.1. No sé cuáles son los efectos secundarios de una versión inferior a la versión instalada, pero al menos funciona el escaneo. Podría ser la única solución para dispositivos sin GPS (si existen tales dispositivos).

Google debería ser crucificado por esto.


Es una vieja pregunta, pero responderé para ayudar a alguien.
Desafortunadamente, la combinación de ACCESS_COARSE_LOCATION y targetSdkVersion 22 no funciona en algunos dispositivos.
Este no es un buen método, pero lo he resuelto de la siguiente manera sin usar permisos de tiempo de ejecución (ACCESS_COARSE_LOCATION o ACCESS_FINE_LOCATION)

  1. Establezca su ''targetSdkVersion'' en 19 (creo que quizás sea posible api19 ~ api22)
  2. Agregue el siguiente permiso a su archivo de manifiesto

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

probado para Android 4.4 ~ 7.1.1


Establezca su ''minSdkVersion'' en 18 targetSdkVersion 22


Si se han concedido permisos, inténtelo: encienda el GPS.


Una: la respuesta no es perfecta, es que aún puede usar el mismo método de escaneo de BT del método anterior, una vez que tenga habilitado el nuevo permiso de Ubicación en tiempo de ejecución.

mBluetoothAdapter.startDiscovery();

.......

private final BroadcastReceiver mReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (BluetoothDevice.ACTION_FOUND.equals(action)) { BluetoothDevice device = (BluetoothDevice) intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); mDeviceList.add(device); } } };