web-dev-qa-db-fra.com

Bluetooth Low Energy startScan sur Android 6.0 ne trouve pas de périphériques

Je développe une application avec Bluetooth Low Energy avec Nexus 5. Cela fonctionnait sous Lollipop, mais pas sous Marshmallow . J'ai défini les autorisations ACCESS_COARSE_LOCATION et ACCESS_FINE_LOCATION dans le manifeste et d'exécution dans l'activité.

Voici la liste des ScanFilters:

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

Ce sont les paramètres:

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'analyse mais ne trouve aucun périphérique. Aidez-moi, s'il vous plaît!!!!

43
Jacopo Tosi

J'ai eu du mal avec le même problème. Pour résoudre ce problème, vous devez activer "Localisation" (GPS) dans les paramètres du téléphone ainsi que 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 d’emplacement, indiquez ce qui suit dans une boîte de dialogue ou dans les préférences de ce type:

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

et mettre en œuvre:

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

dans yourActivity et manipulez 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 paramètres du téléphone:

Location (GPS) services enabled in Phone Settings

Ou comme ceci dans le menu déroulant des réglages rapides:

Location (GPS) services enabled in drop down settings

Une fois que l'utilisateur a activé l'autorisation et démarré les services de localisation, vous devez lancer l'analyse. J'ai remarqué que si vous numérisez déjà pendant que vous activez l'autorisation/activez le service de localisation, il ne mettra toujours rien dans votre onScanResults

Je ne sais pas s'il s'agit d'un bogue ou d'une "fonctionnalité" pour la publicité iBeacons/Bluetooth (NOTE: la publicité consiste à vendre des produits et non la publicité technique à Bluetooth) pour permettre aux entreprises de voir votre emplacement et de vous diriger où elles veulent.

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

EDIT Je voulais ajouter: vous n’avez besoin que de cela pour le balayage. Une fois que vous êtes 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 périphériques. Cependant, vous ne pouvez pas découvrir ou vous connecter à de nouveaux appareils et tous les appareils publicitaires seront supprimés de la onScanResults

61
V-PTR

Comme @Jacopo Tosi, vous devez demander des autorisations de localisation. Vous pouvez lire ici comment le faire . Et vous devez également activer Location. Je ne sais pas pourquoi ils l'ont fait. mais c'est la seule façon pour moi de réussir à le faire fonctionner.

2
Maor Hadad

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

0
CodingYourLife