У меня есть немного моего приложения, которое предназначено для обмена файлами между устройствами через Bluetooth, используя быстрый специальный протокол, который я собрал. В настоящее время в содержащем Activity
я начинаю обнаружение и добавляю любое обнаруженное устройство в RecyclerView. Вот код для BroadcastReceiver
, который обрабатывает это:
private val scanReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (intent.action == BluetoothDevice.ACTION_FOUND) {
val dev = intent.getParcelableExtra<BluetoothDevice>(BluetoothDevice.EXTRA_DEVICE)
Log.d(TAG, "Got device ${dev.name} with address ${dev.address}")
if (dev.name != null) {
Log.d(TAG, "Found nonnull device name, adding")
if (!viewAdapter.dataset.any { it.name == dev.name }) {
viewAdapter.dataset.add(dev)
viewAdapter.notifyDataSetChanged()
}
}
}
}
}
Я хотел изменить это так, чтобы это добавляло только устройства, которые вещали с UUID службы, который я настроил в серверной части приложения. Проведя некоторое исследование, я пришел к этому методу , который я мог бы использовать для получения UUID сервисов на устройстве. Я интегрировал это в свой BroadcastReceiver как таковой
private val scanReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
when (intent.action) {
BluetoothDevice.ACTION_FOUND -> {
val dev = intent.getParcelableExtra<BluetoothDevice>(BluetoothDevice.EXTRA_DEVICE)
Log.d(TAG, "Got device ${dev.name} with address ${dev.address}")
if (dev.name != null) {
dev.fetchUuidsWithSdp()
}
}
//TODO: Untested code
BluetoothDevice.ACTION_UUID -> {
val id = intent.getParcelableExtra<ParcelUuid>(BluetoothDevice.EXTRA_UUID)
if (id.uuid == ShareServerSocket.SERVICE_UUID) {
val dev = intent.getParcelableExtra<BluetoothDevice>(BluetoothDevice.EXTRA_DEVICE)
if (!viewAdapter.dataset.any { it.name == dev.name }) {
viewAdapter.dataset.add(dev)
viewAdapter.notifyDataSetChanged()
}
}
}
}
}
}
(С необходимыми изменениями IntentFilter
я регистрирую его).
Код в новой ветви вызывается, я подтвердил это с некоторыми результатами отладки. Однако ParcelUuid[]
, который мне дают, никогда не содержит UUID моего сервиса, и поэтому устройство никогда не добавляется. Если я сохраню все настройки на устройстве, действующем в качестве сервера, и пропущу новую проверку на клиенте, я смогу нормально подключаться и взаимодействовать. Я не уверен, почему моя служба не будет показана в этот момент.
P.S. Я также проверил кэш SDP, моего UUID службы тоже нет.