web-dev-qa-db-fra.com

Depuis Marshmallow, mettez à jour la découverte Bluetooth à l'aide de BluetoothAdapter.getDefaultAdapter (). StartDiscovery (); est cassé

J'ai une application utilisant Bluetooth et me connectant à des appareils, je ne trouve aucun appareil utilisant BluetoothAdapter.getDefaultAdapter (). StartDiscovery (); Cela a bien fonctionné juste avant la découverte. J'ai également essayé d'autres applications, cela ne fonctionne pas également dans d'autres applications. Mais l'appareil que j'essaie de coupler (Arduino bt-module) peut être trouvé dans les paramètres Android. Avez-vous une idée de ce que je pourrais essayer? J'ai implémenté tout comme décrit sur http: // developer.Android.com/guide/topics/connectivity/bluetooth.html et cela a fonctionné avant la mise à jour.

13
mikugo

L'adaptateur Bluetooth a été modifié en Android 6.0

Vous devez définir l'autorisation ACCESS_FINE_LOCATION ou ACCESS_COARSE_LOCATION et utiliser la méthode BluetoothLeScanner.startScan () pour démarrer l'analyse.

Voici la description des journaux de modifications:

Pour offrir aux utilisateurs une meilleure protection des données, dans Android 6.0, Android supprime l'accès par programmation à l'identifiant matériel local de l'appareil pour les applications utilisant les API Wi-Fi et Bluetooth) Les méthodes WifiInfo.getMacAddress () et BluetoothAdapter.getAddress () renvoient désormais une valeur constante de 02: 00: 00: 00: 00: 00.

Pour accéder aux identifiants matériels des appareils externes à proximité via des analyses Bluetooth et Wi-Fi, votre application doit maintenant disposer des autorisations ACCESS_FINE_LOCATION ou ACCESS_COARSE_LOCATION:

WifiManager.getScanResults()
BluetoothDevice.ACTION_FOUND
BluetoothLeScanner.startScan()

Remarque: lorsqu'un appareil exécutant Android 6.0 (API niveau 23) lance une analyse Wi-Fi ou Bluetooth en arrière-plan, l'opération est visible pour les appareils externes comme provenant d'une adresse MAC aléatoire.

Vous pouvez obtenir plus de détails à partir de ce lien: http://developer.Android.com/about/versions/Marshmallow/Android-6.0-changes.html

31
Megha

Il suffit d'activer la localisation dans les paramètres et cela fonctionne bien !!

5
Mark Ng

À partir du niveau 23 de l'API, une autorisation d'accès à l'emplacement (ACCESS_FINE_LOCATION ou ACCESS_COARSE_LOCATION) est également nécessaire pour la découverte Bluetooth.

https://developer.Android.com/about/versions/Marshmallow/Android-6.0-changes.html#behavior-hardware-id

Et l'ajout d'une autorisation dans le fichier manifeste n'est pas suffisant car l'autorisation appartient au niveau de protection "dangereux". Le consentement de l'utilisateur est nécessaire pour demander l'autorisation lors de l'exécution.

Ajout d'une autorisation dans AndroidManifest.xml:

<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />
<uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission Android:name="Android.permission.BLUETOOTH_ADMIN" />
<uses-permission Android:name="Android.permission.BLUETOOTH" />

Demande d'ACCESS_FINE_LOCATION ou ACCESS_COARSE_LOCATION au moment de l'exécution:

private void accessLocationPermission() {
    int accessCoarseLocation = checkSelfPermission(Android.Manifest.permission.ACCESS_COARSE_LOCATION);
    int accessFineLocation   = checkSelfPermission(Android.Manifest.permission.ACCESS_FINE_LOCATION);

    List<String> listRequestPermission = new ArrayList<String>();

    if (accessCoarseLocation != PackageManager.PERMISSION_GRANTED) {
        listRequestPermission.add(Android.Manifest.permission.ACCESS_COARSE_LOCATION);
    }
    if (accessFineLocation != PackageManager.PERMISSION_GRANTED) {
        listRequestPermission.add(Android.Manifest.permission.ACCESS_FINE_LOCATION);
    }

    if (!listRequestPermission.isEmpty()) {
        String[] strRequestPermission = listRequestPermission.toArray(new String[listRequestPermission.size()]);
        requestPermissions(strRequestPermission, REQUEST_CODE_LOC);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case REQUEST_CODE_LOC:
            if (grantResults.length > 0) {
                for (int gr : grantResults) {
                    // Check if request is granted or not
                    if (gr != PackageManager.PERMISSION_GRANTED) {
                        return;
                    }
                }

                //TODO - Add your code here to start Discovery

            }
            break;
        default:
            return;
    }
}

Plus de détails sur l'autorisation: https://inthecheesefactory.com/blog/things-you-need-to-know-about-Android-m-permission-developer-edition/en

2
Fantasy Pollock