Понадобилось мне как то приложение на телефон с OS Android, для работы с моим устройством на микроконтроллере через Bluetooth. И вот я уже погрузился в изучение Bluetooth в android studio.
Составим простой алгоритм работы:
- При запуске приложения на телефоне, отобразим все Bluetooth устройства, которые уже спарены с телефоном.
- Организуем поиск новых устройств.
- Далее, по нажатию на устройство в списке, сделаем спаривание с этим устройством ( конечно же не для того, что бы появились маленькие Bluetooth –ики, этого требует протокол работы bluetooth)
- Создадим класс для подключение устройств друг с другом по протоколу SPP.
Что ж, план намечен приступаем к действию. Так как статья получается довольно обширная, по этому 3 и 4 пункты опишем в следующей статье.
Включение Bluetooth в телефоне
Что бы начать работать с Bluetooth первым делом его надо включить. Рассмотрим функцию реализующую проверку на включение Bluetooth, и если выключен, предлагает пользователю включить его.
public boolean BluetoothON() { if (!bleAdapter.isEnabled()) { Intent turnOn = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); if (ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { return false; } startActivity(turnOn); } else { return true; } return false; }
Здесь, первым делом мы проверяем есть ли у нас в системе Bluetooth адаптер. Если есть, создаем intent с действием на включение блютуза. Так же нам надо проверить есть ли разрешение на работу с блютуз в манифесте. Результатом работы кода будет следующий рисунок.
Bluetooth в Android Studio: показываем сопряженные устройства
Рассмотрим данный вопрос на примере приведенного ниже кода.
public void GetPairDevise(ArrayList<String> list, BluetoothAdapter bluetoothAdapter) { if (ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { // Выдать сообщение о ошибке return; } Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices(); if (pairedDevices.size() > 0) { for (BluetoothDevice device : pairedDevices) { arrayNewDevice.add(device); list.add(device.getName() + " - " + device.getAddress()); } } }
И так, функция принимает на вход переменную типа ArrayList. В этот массив мы помещаем найденные в системе устройства.
Вторым параметром наш BluetoothAdapter. По сути это наш физический модуль Bluetooth в телефоне. Узнаем о его присутствии через функцию:
getDefaultAtapter();
BluetoothAdapter bleAdapter = BluetoothAdapter.getDefaultAdapter();
Далее необходимо проверить, есть ли необходимые разрешение в нашем файле Манифесте. Без них Bluetooth работать не будет.
Функцией:
getBondedDevices(),
получаем все сопряженные устройства.
Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices();
Далее в цикле проходим по всему сету и добавляем наши устройства в массив для дальнейшей работы и в список отображение. На картинке ниже, результат работы нашей функции.
Bluetooth в android studio: поиск устройств
Поиск новых устройств запускает функция bluetoothAdapter.startDiscovery()
. Результат работы будет в обработчике событий BroadcastResiver
. Это класс в котором идет обработка сообщений.
Посмотрим нижеприведенный код. Сначала мы очистим наши списки. Далее проверим разрешение в манифесте и запустим функцию bluetoothAdapter.startDiscovery().
Инициируем два события: поиск устройств и окончание поиска устройств. После этого регистрируем каждое событие Bluetooth.
public void GetScanDevise(BluetoothAdapter mYBluetoothAdapter) { if (listNewDeviceAdapter.getCount() != 0) listNewDeviceAdapter.clear(); arrayNewDevice.clear(); if (ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_SCAN) != PackageManager.PERMISSION_GRANTED) { return; } myBleAdapter.startDiscovery(); IntentFilter myFilter = new IntentFilter(BluetoothDevice.ACTION_FOUND); registerReceiver(mResiver, myFilter); myFilter = new IntentFilter((BluetoothAdapter.ACTION_DISCOVERY_FINISHED)); registerReceiver(mResiver, myFilter); } private final BroadcastReceiver mResiver = new BroadcastReceiver() { @SuppressLint("MissingPermission") @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (BluetoothDevice.ACTION_FOUND.equals(action)) { myDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); if (myDevice.getName() != null) { arrayNewDevice.add(myDevice); deviseScanList.add(myDevice.getName() + " - " + myDevice.getAddress()); listDevice.setAdapter(listNewDeviceAdapter); } } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { myBleAdapter.cancelDiscovery(); } } };
Внимание! Что бы вновь начать поиск новых устройств, необходимо убедиться, что предыдущий поиск остановлен.
Также можно перед стартом нового поиска сначала вызвать функцию
bleAdapter.cancelDiscovery();
Результат работы кода будет представлен на картинке ниже.
Внимание! Данный программный код представлен из реально работающей программы. Описывал все так как понял сам, читая открытые источники. К сожалению я не являюсь программистом Android, по этому говорю честно, данную задачу можно реализовать красивым и правильным кодом. В этой статье описан просто рабочий код и принцип работы с Bluetooth в android studio на языке java.
Спасибо автор!