Android 13 BLE ScanCallback не вызываетсяAndroid

Форум для тех, кто программирует под Android
Ответить
Гость
 Android 13 BLE ScanCallback не вызывается

Сообщение Гость »


Сейчас я работаю над продуктом BLE, который приобрел после ухода предыдущего разработчика. По их словам, функция сканирования BLE работала, но у меня уже нет. Мне подарили новый продукт (Android 13), поэтому мы предположили, что это может быть причиной, но я проверил новые обновления для Android 13, но так и не нашел проблему.

Вот обзор кода (да, я знаю, что один файл на Kotlin, а другой на Java. Не знаю, почему они решили написать его вот так. Я тоже ничего этого не писал, но думаю логика работает):

var mBluetoothAdapter: BluetoothAdapter? = ноль вар mBTDevice: BluetoothDevice? = ноль var mBTDevices = ArrayList() вар mDeviceListAdapter: DeviceListAdapter? = ноль вар mBLEMain: BLEMain? = ноль класс HomeFragment : Fragment() { var _binding: FragmentSettingBinding? = ноль val привязка get() = _binding!! переопределить удовольствие onCreateView( надуватель: LayoutInflater, контейнер: ViewGroup?, saveInstanceState: Пакет? ): Вид? { _binding = FragmentHomeBinding.inflate(инфлятор) initUI() установитьАдаптер() дескрипторOnClickListener() вернуть привязку.корень } переопределить fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) mBTDevices = java.util.ArrayList() val btManager: BluetoothManager = context?.getSystemService(Context.BLUETOOTH_SERVICE) как BluetoothManager; mBluetoothAdapter = btManager.adapter; } частное развлечение handleOnClickListener() { привязка.применить { btnBTScanButton нажмите { mBLEMAin = BluetoothLE (mBluetoothAdapter, mBTDevice, mBTDevices, this@SettingFragment, viewModel) } } } } публичный класс BluetoothLE расширяет AppCompatActivity реализует AdapterView.OnItemClickListener { BluetoothAdapter mBluetoothAdapter; BluetoothDevice mBTDevice; общественный ArrayList mBTDevices = новый ArrayList(); частный BluetoothLeScanner bluetoothLeScanner; частное логическое сканирование; частное логическое значение подключено; обработчик частного обработчика = новый обработчик(); // Останавливаем сканирование через 10 секунд. частный статический окончательный длинный SCAN_PERIOD = 10000; частный ServiceConnection serviceConnection; public BluetoothLE(BluetoothAdapter mBluetoothAdapter, BluetoothDevice mBTDevice, ArrayList mBTDevices) { this.mBluetoothAdapter = mBluetoothAdapter; this.mBTDevices = mBTDevices; this.mBTDevice = mBTDevice; this.mDeviceListAdapter = новый DeviceListAdapter(fragment.requireContext(), R.layout.bluetooth_list, mBTDevices); this.fragment = фрагмент; this.bluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner(); this.serviceConnection = новый ServiceConnection() { @Override public void onServiceConnected (имя ComponentName, служба IBinder) { bluetoothService = ((BLEConnectionService.LocalBinder) service).getService(); если (bluetoothService!= ноль) { // вызываем функции сервиса для проверки соединения и подключения к устройствам если (!bluetoothService.initialize()) { Log.e(TAG, «Невозможно инициализировать Bluetooth»); заканчивать(); } // выполняем подключение устройства bluetoothService.connect (Адрес устройства); } } @Override public void onServiceDisconnected (имя ComponentName) { BluetoothService = ноль; } }; IntentFilter DiscoverDevicesIntent = makeGattUpdateIntentFilter(); фрагмент.getContext().registerReceiver(gattUpdateReceiver, DiscoverDevicesIntent); сканированиеЛеДевице(); } частный недействительный scanLeDevice () { если (!сканирование) { // Останавливает сканирование по истечении заранее определенного периода сканирования. handler.postDelayed(новый Runnable() { @Override общественный недействительный запуск () { сканирование = ложь; если (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { if (ActivityCompat.checkSelfPermission(fragment.getContext(), Manifest.permission.BLUETOOTH_SCAN) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(fragment.getActivity(), new String[]{Manifest.permission.BLUETOOTH_SCAN}, 102); } }еще{ if (ActivityCompat.checkSelfPermission(fragment.getContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(fragment.getActivity(), new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 105); } } bluetoothLeScanner.stopScan(leScanCallback); } }, SCAN_PERIOD); сканирование = правда; // я не уверен, действительно ли нам все это нужно, но я включил это для устранения неполадок, чтобы увидеть, что-то не так с завивками - похоже, что это не так если (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { if (ActivityCompat.checkSelfPermission(fragment.getContext(), Manifest.permission.BLUETOOTH_SCAN) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(fragment.getActivity(), new String[]{Manifest.permission.BLUETOOTH_SCAN}, 102); } if (ActivityCompat.checkSelfPermission(fragment.getContext(), Manifest.permission.BLUETOOTH_PRIVILEGED) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(fragment.getActivity(), new String[]{Manifest.permission.BLUETOOTH_PRIVILEGED}, 102); } if (ActivityCompat.checkSelfPermission(fragment.getContext(), Manifest.permission.BLUETOOTH) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(fragment.getActivity(), new String[]{Manifest.permission.BLUETOOTH}, 102); } if (ActivityCompat.checkSelfPermission(fragment.getContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(fragment.getActivity(), new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 102); } if (ActivityCompat.checkSelfPermission(fragment.getContext(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(fragment.getActivity(), new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 102); } if (ActivityCompat.checkSelfPermission(fragment.getContext(), Manifest.permission.ACCESS_BACKGROUND_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(fragment.getActivity(), new String[]{Manifest.permission.ACCESS_BACKGROUND_LOCATION}, 102); } если (ActivityCompat.checkSelfPermission(fragment.getContext(), Manifest.permission.BLUETOOTH_ADMIN) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(fragment.getActivity(), new String[]{Manifest.permission.BLUETOOTH_ADMIN}, 102); } } еще { if (ActivityCompat.checkSelfPermission(fragment.getContext(), Manifest.permission.BLUETOOTH_SCAN) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(fragment.getActivity(), new String[]{Manifest.permission.BLUETOOTH_SCAN}, 102); } if (ActivityCompat.checkSelfPermission(fragment.getContext(), Manifest.permission.BLUETOOTH_PRIVILEGED) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(fragment.getActivity(), new String[]{Manifest.permission.BLUETOOTH_PRIVILEGED}, 102); } if (ActivityCompat.checkSelfPermission(fragment.getContext(), Manifest.permission.BLUETOOTH) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(fragment.getActivity(), new String[]{Manifest.permission.BLUETOOTH}, 102); } if (ActivityCompat.checkSelfPermission(fragment.getContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(fragment.getActivity(), new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 102); } if (ActivityCompat.checkSelfPermission(fragment.getContext(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(fragment.getActivity(), new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 102); } if (ActivityCompat.checkSelfPermission(fragment.getContext(), Manifest.permission.ACCESS_BACKGROUND_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(fragment.getActivity(), new String[]{Manifest.permission.ACCESS_BACKGROUND_LOCATION}, 102); } if (ActivityCompat.checkSelfPermission(fragment.getContext(), Manifest.permission.BLUETOOTH_ADMIN) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(fragment.getActivity(), new String[]{Manifest.permission.BLUETOOTH_ADMIN}, 102); } } bluetoothLeScanner.startScan(leScanCallback); } еще { сканирование = ложь; bluetoothLeScanner.stopScan(leScanCallback); } } частный ScanCallback leScanCallback = новый ScanCallback() { @Override public void onScanResult (int callbackType, результат ScanResult) { super.onScanResult(callbackType, результат); Log.d("BLE", "in scanCallback"); if (ActivityCompat.checkSelfPermission(fragment.getContext(), Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(fragment.getActivity(), new String[]{Manifest.permission.BLUETOOTH_CONNECT}, 100); } Log.d("BLE", "Имя устройства: " + result.getDevice().getName()); Log.d("BLE", "Адрес устройства: " + result.getDevice().getAddress()); if (result.getDevice().getName() != null && result.getDevice().getName().contains("ESP32") == true) { mBTDevices.add(result.getDevice()); } mDeviceListAdapter = новый DeviceListAdapter(fragment.getContext(), R.layout.bluetooth_list, mBTDevices); lvNewDevices.setAdapter(mDeviceListAdapter); mDeviceListAdapter.notifyDataSetChanged(); } @Override public void onBatchScanResults(List results) { super.onBatchScanResults(результаты); for (ScanResult sr: результаты) { Log.d("BLE", sr.toString()); } } @Override public void onScanFailed (int errorCode) { super.onScanFailed(код ошибки); Log.d("BLE", "Код ошибки: " + errorCode); } }; } Моя проблема в том, что ничего в ScanCallback не регистрируется, и я использую это, чтобы предположить, что он не вызывается.

Некоторые вещи, которые я заметил при попытке устранения неполадок:
[*]РАЗРЕШЕНИЯ
Bluetooth включен в настройках. Приведенный выше код также проверяет все возможные разрешения на сканирование.

Манифест:

[*]ОГРАНИЧИТЕЛЬНОЕ ВЕДРО (?) В различных сообщениях SO я видел, что новое обновление Android 13 привело к ограничению некоторых приложений, поэтому они больше не могут запускать BLE. Я запустил код, чтобы проверить свое приложение, и он вернул 10, что, я почти уверен, означает, что все в порядке.

Сейчас меня интересует только сканирование, поэтому я опустил соответствующий код BLEService и GATT. Я почти уверен, что эти коды не имеют отношения к правильному сканированию. Если нет, я отредактирую свое сообщение и включу их.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»