Инициировать Bluetooth-модем программно - PullRequest
2 голосов
/ 30 марта 2012

Класс Android bluetooth довольно прост в использовании для включения, обнаружения, вывода списка сопряженных устройств и подключения к устройствам Bluetooth.

Мой план состоял в том, чтобы инициировать соединение с другим устройством Bluetooth, которое обеспечивает модем через Bluetooth.

После небольшого исследования это выглядит неосуществимым - похоже, мне придется самому реализовать профиль, иметь root-доступ для работы в сети и делать все в приложении.

Также, похоже, нет намерения, которое я могу вызвать через Настройки, чтобы инициировать соединение Bluetooth, лучшее, что я могу сделать, это включить его.

Я что-то упустил - если система не предоставляет метод для инициирования соединения Bluetooth на системном уровне, мне не повезло?

1 Ответ

3 голосов
/ 26 декабря 2014

Частный профиль уже присутствует в API: BluetoothPan

Bluetooth PAN (персональная сеть) - это правильное имя для определения привязки по Bluetooth.

Этот закрытый класс позволяет подключаться и отключаться от устройства, предоставляющего профиль Bluetooth PAN, с помощью методов public boolean connect(BluetoothDevice device) и public boolean disconnect(BluetoothDevice device).

Вот пример фрагмента, подключаемого к определенному устройству:

String sClassName = "android.bluetooth.BluetoothPan";

class BTPanServiceListener implements BluetoothProfile.ServiceListener {

    private final Context context;

    public BTPanServiceListener(final Context context) {
        this.context = context;
    }

    @Override
    public void onServiceConnected(final int profile,
                                   final BluetoothProfile proxy) {
        Log.e("MyApp", "BTPan proxy connected");
        BluetoothDevice device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice("AA:BB:CC:DD:EE:FF"); //e.g. this line gets the hardware address for the bluetooth device with MAC AA:BB:CC:DD:EE:FF. You can use any BluetoothDevice
        try {
            Method connectMethod = proxy.getClass().getDeclaredMethod("connect", BluetoothDevice.class);
            if(!((Boolean) connectMethod.invoke(proxy, device))){
                Log.e("MyApp", "Unable to start connection");
            }
        } catch (Exception e) {
            Log.e("MyApp", "Unable to reflect android.bluetooth.BluetoothPan", e);
        }
    }

    @Override
    public void onServiceDisconnected(final int profile) {
    }
}

try {

     Class<?> classBluetoothPan = Class.forName(sClassName);

     Constructor<?> ctor = classBluetoothPan.getDeclaredConstructor(Context.class, BluetoothProfile.ServiceListener.class);
     ctor.setAccessible(true);
     Object instance = ctor.newInstance(getApplicationContext(), new BTPanServiceListener(getApplicationContext()));
} catch (Exception e) {
     Log.e("MyApp", "Unable to reflect android.bluetooth.BluetoothPan", e);
}
...