Проблема с обнаружением устройств на Android с помощью bluetooth
В моём приложении мне нужно будет соединяться и работать с устройствами по bluetooth. На сайте android studio я прочитал, как проверить поддержку BT, сопряженные устройства, добавить их в список, с этим проблем не было, всё работало. Но код, который должен искать устройства рядом, никак не хочет работать, как бы я не пытался. Сначала думал, что проблема именно в динамическом массиве или в ListView, в который должны добавляться имена и адреса найденный устройств, поэтому пробовал создавать другой ListView, другой массив, пытался вывести информацию в toast, но нет, ничего не срабатывало. Такое чувство, что метод onReceive класса BroadcastReceiver вообще не работает. Может быть проблема в самом телефоне, на котором я всё это тестирую? (Вне приложения телефон нормально находит устройства) Вот код, в котором я пытаюсь найти новые устройства методом startDiscovery(), засунуть их в динамический массив discoveredDevices и отобразить в ListView с помощью адаптера, попутно отобразив этапы метода onReceive в toast. Метод discoverDevices() срабатывает по нажатию кнопки (код создания кнопок и проверки сопряженный устройств опустил, чтобы не загромождать место, но если нужен, он здесь https://github.com/HtonicSava/src/blob/main/main/java/com/example/myapplication/MainActivity.java):
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION " />
public class MainActivity extends AppCompatActivity {
BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();
boolean buttonToggle = false;
ArrayList<String> discoveredDevices = new ArrayList<>();
ListView listView;
ArrayAdapter<String> adapter;
final BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) {
Toast toast = Toast.makeText(getApplicationContext(),"ACTION_DISCOVERY_STARTED" , Toast.LENGTH_SHORT);
toast.show();
//discovery starts
} else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
//discovery finishes
Toast toast = Toast.makeText(getApplicationContext(),"ACTION_DISCOVERY_FINISHED" , Toast.LENGTH_SHORT);
toast.show();
} else if (BluetoothDevice.ACTION_FOUND.equals(action)) {
Toast toast = Toast.makeText(getApplicationContext(), "ACTION_FOUND", Toast.LENGTH_SHORT);
toast.show();
//bluetooth device found
BluetoothDevice device = (BluetoothDevice) intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
discoveredDevices.add(device.getName() + " : " + device.getAddress());
adapter.notifyDataSetChanged();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = getIntent();
String[] message = intent.getStringArrayExtra(LoginMenu.EXTRA_MESSAGE);
TextView textView = findViewById(R.id.textView);
textView.setText(getString(R.string.profile_info, message[0], message[1]));
listView = findViewById(R.id.pairedList);
adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, discoveredDevices);
listView.setAdapter(adapter);
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothDevice.ACTION_FOUND);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
registerReceiver(receiver, filter);
checkBluetooth();
}
public void discoverDevices(){
bluetooth.startDiscovery();
adapter.notifyDataSetChanged();
}