#android #bluetooth #android-bluetooth
#Android #bluetooth #android-bluetooth
Вопрос:
Я хочу создать приложение, которое сканирует локальные устройства Bluetooth. Приложение находит все сопряженные устройства, но не спаренные устройства. У меня есть кнопка, и когда я нажимаю ее, я хочу видеть в Log
найденных устройствах.
В AndroidManifest
я добавил разрешения для BLUETOOTH
, BLUETOOTH_ADMIN
и ACCESS_COARSE_LOCATION
.
onCreate
Я получаю адаптер Bluetooth по умолчанию и получаю сопряженные устройства.
protected void onCreate(Bundle savedInstanceState) {
....
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if(!bluetoothAdapter.isEnabled()) {
Intent enable = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enable, REQUEST_ENABLE_BT);
}
pairedDevices = bluetoothAdapter.getBondedDevices();
///Add paired Devices
for(BluetoothDevice device : pairedDevices){
Log.i("DEVICE", device.getAddress() " " device.getName());
devicesList.add(device);
}
}
При onClick
выполнении scanDevices
функции, в которой я использую ScanCallBack
.
final ScanCallback scanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
super.onScanResult(callbackType, result);
if(!devicesList.contains(result.getDevice())) {
Log.i("DEVICE", result.getDevice().getName() " " result.getDevice().getAddress());
devicesList.add(result.getDevice());
}
}
@Override
public void onScanFailed(int errorCode) {
super.onScanFailed(errorCode);
}
};
bluetoothAdapter.getBluetoothLeScanner().startScan(scanCallback);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
bluetoothAdapter.getBluetoothLeScanner().stopScan(scanCallback);
}
}, 10000);
}
Когда я запускаю приложение, оно ничего не делает, ни одно устройство не отображается в журнале, и когда я пытаюсь его отладить, оно даже не останавливается в ScanCallback.
Комментарии:
1. Знаете ли вы, почему он не находит все устройства при первом сканировании?
Ответ №1:
Начиная с Android 6.0 / Marshmallow, для любого сканирования Bluetooth требуются два следующих условия:
- Разрешение на местоположение (ACCESS_COARSE_LOCATION пока достаточно, но, по-видимому, не в бета-версии Android Q);
- Службы определения местоположения включены и включены.
Таким образом, это означает, что на любом устройстве под управлением Android 6 или next вы должны использовать систему запроса разрешений во время выполнения, чтобы попросить пользователя предоставить вам доступ к его местоположению. Но этого недостаточно, пользователь также должен включить свою службу определения местоположения (точность не проблема).
Вы можете добиться этого либо с помощью служб Google Play, чтобы показать всплывающее окно с просьбой к пользователю включить службы определения местоположения, либо перенаправить на службы определения местоположения в приложении «Настройки», где пользователь может включить службу определения местоположения своего устройства.
Как только оба условия будут выполнены, устройства начнут отображаться в журналах, если они, конечно, находятся в зоне действия.
Примечание: это также справедливо для простого обнаружения Bluetooth с помощью Bluetooth Classic.
Комментарии:
1. Знаете ли вы, почему он не находит все устройства при первом сканировании?
2. Добро пожаловать! Я предполагаю, что при первом сканировании возможно, что в зависимости от аппаратного обеспечения это может произойти. Известно, что низкое энергопотребление на Android всегда было нестабильным, и с учетом разнообразия существующих устройств это неудивительно.
3. У меня есть еще один вопрос, вы знаете, почему он продолжает отключаться через несколько мгновений?
4. Что вы имеете в виду под отключением? Вы имеете в виду, что вы установили соединение с файловым устройством, и это соединение закрывается через некоторое время?
5. Да, именно это