BluetoothLeScanner.startScan avec Android 6.0 n'est pas de découvrir des périphériques
Je suis en train d'utiliser la fonction BluatoothLeScanner.startScan au lieu de le obsolète un BluetoothAdapter.startLeScan.
Hier, j'ai mis à jour mon Nexus 5 pour Android 6.0 et depuis ce moment, mon application ne fonctionne plus.
J'ai tout d'abord ajouter les préférences nécessaire ACCESS_COARSE_LOCATION que l'on trouve ici https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-hardware-id.
Ensuite, j'ai ajouté la permission, comme décrit ici: https://developer.android.com/training/permissions/requesting.html.
Mais à la fin, il ne semble pas travailler, de ne pas renvoyer le ble appareils.
C'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 ne me suis tourné sur le GPS. Il est facile de le faire par programmation dans de cette façon.
Oui, regardez ici, il y a la solution: Bluetooth Low Energy startScan sur Android 6.0 ne pas rechercher les périphériques Cependant, la solution est la suivante: ajouter des autorisations dans le manifeste, ajouter des autorisations à l'exécution dans l'activité avec la ScanDevice, allumez le GPS. Est incroyable de penser mais mon problème est le GPS off
Je viens de tester avec le GPS allumé et cela a fonctionné (j'étais sur une tablette qui avait éteint).. C'est fou que nous devons avoir le GPS activé pour l'analyse de BLE dispositifs, ce qui si l'appareil ne dispose même pas d'une puce GPS? Un bug a besoin d'obtenir immédiatement remis. Je pense que le fitbit les gars et les autres à faire des BLE appareils pour les masses qui aurait frappé google avec ces questions déjà.
WTF, activer le GPS sur Android 6.0 rend le scanner de trouver BLE appareils. Je comprends maintenant pourquoi la permission
ACCESS_COARSE_LOCATION
est nécessaire. Google, WTF?!?OriginalL'auteur Jacopo Tosi | 2015-10-08
Vous devez vous connecter pour publier un commentaire.
si les autorisations accordées, avoir un essai: allumer le GPS.
Android 6.0 Changements:Pour fournir aux utilisateurs une plus grande protection des données, à partir de cette version, Android supprime l'accès par programme à l'appareil local de l'identifiant matériel pour des applications en utilisant le Wi-Fi et Bluetooth Api.
Vous avez fait ma journée!
Ce serait bien, mais dans mon cas, ce n'est pas une option pour activer le GPS, afin de recevoir phare de la publicité. Vous simplement ne pouvez pas trouver un travail d'explication, de ce que le GPS est utilisé pour, lorsque la tâche est de recevoir des signaux bluetooth... 😉
OriginalL'auteur qinmiao
Est vous application d'une demande d'Emplacement autorisation au démarrage? Si elle ne l'est pas, manipuler le code quelque part d'autre alors qu'il est invité.
Aussi, vous pouvez cocher cette case pour tester si votre application fonctionne bien:
Ouvrir les Paramètres > Applications > YourApplication > les Autorisations
et activer la Localisation et ensuite essayer de les analyser pour les résultats.
Emplacement seront inscrits en vertu des autorisations uniquement si vous avez fourni ACCESS_COARSE_LOCATION sur le manifeste.
j'ai ajouté "fine" et "grosses" les autorisations, mais toujours pas de chance. découverte de rappel n'est pas déclenché. Guimauve sur la Nexus 9. j'ai vérifié l'Emplacement est autorisé dans les paramètres android de l'application. Je peux voir le périphérique est détecté, mais le rappel n'est pas déclenché. Aussi je peux vérifier qu'il est tiré sur Lollipop. Toute solution?
Je peux le confirmer. Après l'ajout de ACCESS_COARSE_LOCATION ou ACCESS_FINE_LOCATION pour le Manifeste ET l'activation de l'Emplacement dans le téléphone, BLE de numérisation des œuvres. Je l'ai testé sur Nexus 6 avec Android 6.0 et il fonctionne.
OriginalL'auteur Kamal Kishore
En utilisant les solutions proposées ci-dessus fonctionne, mais l'effet secondaire est que vous devez avoir activé les services de localisation sur quelque chose qui n'en a pas besoin. Moche et peu satisfaisant contourner est de spécifier la version cible dans votre manifeste pour
android:targetSdkVersion="21"
Il permet de scanner sur mon Nexus 7, même si la version installée est 6.0.1. Je ne sais pas quels sont les effets secondaires sont de ciblage d'une version plus ancienne que la version installée mais au moins la numérisation des œuvres. Peut-être la seule solution pour le GPS-moins de périphériques (si de tels dispositifs existent).
Google devrait être crucifié pour cela.
OriginalL'auteur Brian Reinhold
- Pas de réponse parfaite, c'est que vous pouvez toujours utiliser la même vieille méthode BT méthode de scan, une fois que vous avez le nouveau runtime Emplacement autorisation.
.......
Je suis désolé si vous avez l'impression, à tort. Je suis simplement en indiquant qu'il n'y a absolument aucun rapport entre Bluetooth Classique de la Découverte et du Bluetooth Low Energy Scan. Ces deux analyses sont complètement différents. La première analyse ne reviendra jamais BLE des appareils à moins qu'il y a le mode dual et détectable. Et enfin, vous n'avez pas besoin de l'emplacement de l'autorisation et de permis pour les Classiques de détection Bluetooth (juste essayé qu'aujourd'hui).
Mais le "classique" recherche d'appareils dans les paramètres par défaut des options d'analyse aussi les BTLE appareils. Donc, il découvre à la fois classique et BTLE appareils. L'inconvénient est que la seule prochaine étape, on peut prendre est de paire avec l'appareil. On ne peut donc pas se connecter à BTLE appareils qui ne sont pas de paire en utilisant cette approche.
OriginalL'auteur aiden_fry
C'est une vieille question, mais je vais répondre pour aider quelqu'un.
Malheureusement, la combinaison de ACCESS_COARSE_LOCATION et targetSdkVersion 22 ne fonctionne pas sur certains appareils.
Ce n'est pas une bonne méthode, mais j'ai résolu de la façon suivante sans l'aide d'exécution des autorisations (ACCESS_COARSE_LOCATION ou ACCESS_FINE_LOCATION)
Ajouter de l'autorisation suivante à votre fichier manifeste
testé pour Android 4.4 ~ 7.1.1
OriginalL'auteur Andromer
Définir votre "minSdkVersion' à 18
targetSdkVersion 22
OriginalL'auteur Rest