BluetoothLeScanner.startScan avec Android 6.0 ne découvre pas d'appareils
j'essaie d'utiliser la fonction BluatoothLeScanner.startScan au lieu d'un BluetoothAdapter.startLeScan. Hier, J'ai mis à jour mon Nexus 5 à Android 6.0 et depuis ce moment mon application ne fonctionne plus. J'ai tout d'abord ajouter les préférences requis 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é permission telle que dà © crite ici:https://developer.android.com/training/permissions/requesting.html. Mais à la fin, il semble ne pas fonctionner, il ne renvoie pas les appareils.
voici 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, j'ai seulement activé le GPS. Il est facile de le faire par programmation dans de cette façon.
6 réponses
est-ce que vous appliquez une demande d'autorisation de localisation au démarrage? Si ce n'est pas le cas, manipulez le code ailleurs pour qu'il soit activé.
vous pouvez également vérifier cela pour tester si votre application fonctionne bien:
Ouvrez Paramètres > Applications > YourApplication > Autorisations et activez L'emplacement et ensuite essayer de scanner pour les résultats.
L'emplacement sera indiqué sous permissions seulement si vous avez fourni ACCESS_COARSE_LOCATION sur le manifeste.
utiliser les solutions fournies ci-dessus fonctionne, mais l'effet secondaire est que vous devez avoir des services de localisation activés pour quelque chose qui n'en a pas besoin. Moche et peu satisfaisant contourner est de spécifier la version cible dans votre manifeste à
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 de cibler une version plus basse que la version installée, mais au moins la numérisation des œuvres. Pourrait être la seule solution pour les appareils sans GPS (si de tels appareils existent).
Google devrait être crucifié pour cela.
- 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.
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);
}
}
};
C'est une vieille question, mais je vais répondre pour aider quelqu'un.
Malheureusement, la combinaison ACCESS_COARSE_LOCATION et targetSdkVersion 22 ne fonctionne pas sur certains appareils.
ce n'est pas une bonne méthode, mais je l'ai résolue de la manière suivante sans utiliser les permissions d'exécution (ACCESS_COARSE_LOCATION ou ACCESS_FINE_LOCATION)
- Définissez votre' targetSdkVersion ' à 19 (je pense que peut-être api19 ~ api22 sera possible)
Ajouter l' suite à la permission de votre fichier de manifeste
<uses-permission android:name="android.permission.READ_OWNER_DATA" /> <uses-permission android:name="android.permission.WRITE_OWNER_DATA" />
testé sur Android 4.4 ~ 7.1.1