Bluetooth Low Energy startScan sur Android 6.0 ne trouve pas d’appareils

Je développe une application avec Bluetooth Low Energy en utilisant Nexus 5. Cela a fonctionné sur Lollipop et maintenant il ne fonctionne plus sur Marshmallow. Je définis les permissions ACCESS_COARSE_LOCATION et ACCESS_FINE_LOCATION dans le manifeste et sur runTime dans l’activité.

Voici la liste de ScanFilters:

mScanFilterTest = new ScanFilter.Builder().build(); mScanFilter = new ArrayList(); mScanFilter.add(mScanFilterTest); 

Ce sont les parameters:

 mScanSettings = new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_POWER).setReportDelay(0) .setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES).build(); 

Ce sont mes rappels:

  mBLEScan = new ScanCallback() { @Override public void onScanResult(int callbackType, ScanResult result) { super.onScanResult(callbackType, result); Log.i(TAG, "******************************************"); Log.i(TAG, "The scan result " + result); Log.i(TAG, "------------------------------------------"); } }; 

Ceci est mon appel:

 mBluetoothLeScanner.startScan(mScanFilter, mScanSettings, mBLEScan); 

Il lance l’parsing mais ne trouve aucun périphérique. Aidez-moi, s’il vous plaît!!!!

J’ai lutté avec le même problème. Pour résoudre ce problème, vous devez activer “Location” (GPS) dans les parameters du téléphone et demander l’autorisation de localisation dans l’application au moment de l’exécution. Les deux doivent être effectués pour que la numérisation fonctionne correctement.

Pour demander l’autorisation de localisation, placez les éléments suivants dans une boîte de dialog ou les éléments suivants:

 yourActivity.requestPermissions(new Ssortingng[]{Manifest.permission.ACCESS_COARSE_LOCATION}, yourPermissionRequestCode); 

et mettre en œuvre:

 @Override public void onRequestPermissionsResult(int requestCode, Ssortingng permissions[], int[] grantResults){ if(requestCode == yourPermissionRequestCode) { ... //Do something based on grantResults } } 

dans yourActivity et gère tout ce que l’utilisateur sélectionne. Vous devez également procéder comme suit pour activer les services de localisation de votre appareil:

 Intent enableLocationIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); yourActivity.startActivityForResult(enableLocationIntent, yourServiceRequestCode); 

Vous pouvez vérifier si l’utilisateur a activé les services de localisation en implémentant:

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode == yourServiceRequestCode) { ...//Do whatever you need to } } 

dans yourActivity Vous pouvez également activer manuellement les services de localisation (GPS) en procédant comme suit:

Enter phone settings -> Select "Location" -> Then turn it on

Cela devrait ressembler à ceci dans les parameters du téléphone:

Services de localisation (GPS) activés dans les paramètres du téléphone

Ou comme ceci dans la liste déroulante des parameters rapides:

Services de localisation (GPS) activés dans les paramètres déroulants

Une fois que l’utilisateur a activé l’autorisation et démarré les services de localisation, vous devez commencer à numériser. J’ai remarqué que si vous parsingz déjà pendant que vous activez la permission / allumez le service de localisation, il n’y aura toujours rien dans votre onScanResults

Je ne sais pas s’il s’agit d’un bug ou d’une «fonctionnalité» pour les publicités iBeacons / Bluetooth (NOTE: publicité comme vente de produits, pas la publicité technique Bluetooth) pour permettre aux entresockets de voir votre position et vous diriger.

J’espère que cela corrige votre problème!

EDIT je voulais append: vous en avez seulement besoin pour SCANNING. Une fois connecté au périphérique BLE, vous pouvez désactiver le service de localisation sur votre téléphone et vous serez toujours connecté à vos appareils. Cependant, vous ne pouvez pas découvrir ou vous connecter à de nouveaux périphériques et tous les périphériques publicitaires seront onScanResults des résultats onScanResults

Comme @Jacopo Tosi, vous devez demander des permissions de localisation. Vous pouvez lire ici comment le faire. Et vous devez également activer l’emplacement. Je ne sais pas pourquoi le fait mais c’est la seule façon dont j’ai réussi à le faire fonctionner.

Dans mon cas (HTC M9), je devais également accéder au menu Paramètres Android sous Bluetooth et rechercher manuellement les appareils BT.