web-dev-qa-db-fra.com

BluetoothLeScanner.startScan avec Android 6.0 ne détecte pas les périphériques

J'essaie d'utiliser la fonction BluatoothLeScanner.startScan au lieu de la version obsolète BluetoothAdapter.startLeScan . Hier, j'ai mis à jour mon Nexus 5 vers Android 6.0 et depuis ce moment, mon application ne fonctionne plus. . J'ajoute d'abord les préférences requises ACCESS_COARSE_LOCATION comme trouvé ici, https://developer.Android.com/about/versions/Marshmallow/Android-6.0-changes.html#behavior-hardware- id . Puis j'ai ajouté l'autorisation comme décrit ici: https://developer.Android.com/training/permissions/requesting.html } _. Mais à la fin, il semble ne fonctionne pas, il ne renvoie pas les périphériques bles.

Ceci est mon code:

manifeste

<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);
            }
        }

EDIT: pour résoudre ce problème je n’ai allumé que le GPS. Il est facile de le faire par programme dans de cette façon .

17
Jacopo Tosi

si les autorisations sont accordées, essayez: allumez le GPS.

17
qinmiao

Votre application demande-t-elle l'autorisation d'emplacement au démarrage? Si ce n'est pas le cas, manipulez le code ailleurs pour qu'il y soit invité.

Vous pouvez également vérifier si votre application fonctionne bien:

Ouvrez Paramètres> Applications> Votre application> Autorisations , Activez Emplacement, puis essayez de rechercher les résultats.

L'emplacement sera répertorié sous autorisations uniquement si vous avez fourni ACCESS_COARSE_LOCATION sur le manifeste.

6
Kamal Kishore

L'utilisation des solutions fournies ci-dessus fonctionne, mais l'effet secondaire est que les services de localisation doivent être activés pour un service qui n'en a pas besoin. Un travail moche et insatisfaisant consiste à spécifier la version cible dans votre manifeste pour

Android: targetSdkVersion = "21"

Il permet de numériser sur mon Nexus 7 même si la version installée est 6.0.1. Je ne sais pas quels sont les effets secondaires du ciblage d'une version plus basse que la version installée, mais au moins le scan fonctionne. Peut-être la seule solution pour les appareils sans GPS (si de tels appareils existent).

Google devrait être crucifié pour cela.

3
Brian Reinhold

Une des réponses - pas parfaite, est que vous pouvez toujours utiliser la même méthode de méthode d'analyse BT, une fois que la nouvelle autorisation d'emplacement d'exécution est activée.

            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);


            }
        }
    };
0
aiden_fry

C'est une vieille question, mais je vais répondre pour aider quelqu'un.
Malheureusement, la combinaison d'ACCESS_COARSE_LOCATION et de targetSdkVersion 22 ne fonctionne pas sur certains périphériques.
Ce n'est pas une bonne méthode, mais je l'ai résolue de la manière suivante sans utiliser les autorisations d'exécution (ACCESS_COARSE_LOCATION ou ACCESS_FINE_LOCATION)

  1. Définissez votre 'targetSdkVersion' sur 19 (je pense que api19 ~ api22 sera possible)
  2. Ajoutez l'autorisation suivante à votre fichier manifeste

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

testé pour Android 4.4 ~ 7.1.1

0
Andromer