Java класс для Bluetooth Android

135
17 сентября 2019, 22:00

Всем привет. Вот пишу отдельный класс java, который будет отвечать чисто только за управление Bluetooth на android-устройстве. Хотел бы написать два метода, которые:

  1. Первый будет включать или выключать Bluetooth и при этом что-бы возвращал true либо false, в зависимости от успеха включения.
  2. Второй будет осуществлять поиск устройств и возвращать список найденных устройств. Со вторым методом я так понял не все так гладко, потому как на поиск затрачивается время, а метод выполняется полностью и сразу. Потому я думаю в таком случае использовать callback-функцию. А вот с первым проблема тоже кроется в том, что включение Bluetooth выполняется при помощи интента, то есть:

    Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); context.startActivity(intent);

А тут либо в Activity придется переопределять метод onActivityResult(), а я не хотел бы этого делать, потому как хотелось бы сделать классы независимыми друг от друга, следуя принципам инкапсуляции.

Как бы грамотнее это все можно было оформить? Не хочу все нагромождать в одной активности -- это неправильно!

Заранее большое спасибо тем, кто решил помочь! Всем добра и успехов вам!

Answer 1

В качестве ответа на свой вопрос нашел следующие решения:

  1. В первом случае, что-бы включить или выключить Bluetooth можно вызывать у адаптера BluetoothAdapter методы enable() и disable(). Они возвращают true, либо false в зависимости от успеха их выполнения.

К примеру мой метод для включения Bluetooth выглядит так:

public boolean enableBluetooth(boolean switchBt) {
    if (adapter != null) {
        return (switchBt) ? adapter.enable() : adapter.disable();
    }
    return false;
}

Не забудьте где нибудь в конструкторе инициализировать adapter:

BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
  1. Во-втором случае, связанным с поиском устройств, я поступил так как и думал до этого, то есть -- использовал callback-методы. Создал интерфейс Callback с методом onDiscoverStatus(int status):

    public interface Callback { void onDiscoverStatus(int status); }

Далее создал IntentFilter с отслеживаемыми событиями начала поиска, конца поиска и обнаружения устройства. Затем создал BroadcastReceiver с этими же событиями и зарегистрировал его. По наступлению какого либо события вызывал callback-метод. Далее в другом классе, где надо было получить информацию о наступлении одного из события имплементировал интерфейс Callback.

IntentFilter

IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
filter.addAction(BluetoothDevice.ACTION_FOUND);
this.context.registerReceiver(receiver, filter); 

BroadcastReceiver

private BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        final String action = intent.getAction();
        switch (action) {
            case BluetoothAdapter.ACTION_DISCOVERY_STARTED:
                callback.onStatusDiscover(STARTED);
                break;
            case BluetoothAdapter.ACTION_DISCOVERY_FINISHED:
                callback.onStatusDiscover(FINISHED);
                break;
            case BluetoothDevice.ACTION_FOUND:
                callback.onStatusDiscover(FOUND);
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                if (device != null) {
                    callback.onStatusDiscover(FOUND);
                    callback.onFound(device);
                }
                break;
        }
    }
};

Допустим подключили интерфейс где нибудь в активности

MainActivity

public class MainActivity extends Activity implements Callback {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_activity);
}
@Override
public void onDiscoverStatus(int status) {
    // что то делаем если пришел статус STARTED или FINISHED
}

}

Не забудьте потом по окончанию работы разрегистрировать BroadcastReceiver при помощи метода context.unregisterReceiver(receiver)

READ ALSO
Корректны ли в Java записи подобного вида?

Корректны ли в Java записи подобного вида?

Приложение работает, но принято ли так писать в Java? Просто для каждой переменной неудобно писать "public static String

143
setPreferredSize Java [закрыт]

setPreferredSize Java [закрыт]

Извините за глупый вопрос, но обязательно ли в качестве аргумента setPreferredSize использовать объект Dimension?

130
Telegram API - InlineKeyboardMarkup - не могу найти библиотеку (JDK11)

Telegram API - InlineKeyboardMarkup - не могу найти библиотеку (JDK11)

Не могу найти класс InlineKeyboardMarkup в библиотеке TELEGRAM API telegrambots-41-jar-with-dependencies

157
Получение блока XML по селектору

Получение блока XML по селектору

Я использую worldweatheronline APIСервис отдает xml примерно в следующем виде:

181