Подключение к Bluetooth программно

Я пытаюсь подключить программно свое устройство, например, к моим гарнитурам... У меня была версия KitKat, и все работало отлично (Bluetooth всегда автоматически связывалось без проблем), но так как я обновился до Lolipop нет. Я хотел бы знать, есть ли способ подключить любое сопряженное устройство моего Android phone к Bluetooth, когда оно включается.

С тех пор, как я получил этот код (получает имя устройства и адрес устройства), потому что я думал, что с ним можно подключиться, делая что-то вроде device.connect(MAC-Address);, но это не сработало...

    BluetoothAdapter bluetoothAdapter
    = BluetoothAdapter.getDefaultAdapter();
Set < BluetoothDevice > pairedDevices = bluetoothAdapter.getBondedDevices();
if (pairedDevices.size() > 0) {
    for (BluetoothDevice device: pairedDevices) {
        mDeviceName.add(device.getName());
        mDeviceMAC.add(device.getAddress());

    }
}
bluetoothClass.setDeviceName(mDeviceName);
bluetoothClass.setDeviceMac(mDeviceMAC);

Вопрос

В моем MotoG (KitKat), если я переверну свой Bluetooth, он автоматически подключается к устройству (если он близок и парен...), но на моем LG G3 я должен перейти к Конфигурации/Bluetooth/Сопряженные устройства/и там коснитесь устройства для подключения... и я хочу избежать этого... должно быть возможно?


Я хотел бы знать, есть ли возможность подключиться к определенному Bluetooth, просто добавив Device name или Device MAC... Больше или меньше нравится Android, когда я нажимаю на свое устройство, чтобы подключиться, он автоматически подключается... Я просто хочу получить это событие CLICK. Я знаю, что Android должен автоматически подключаться к сопряженному устройству, но есть исключения, которые не делают... единственный способ соединить его с кликом... вот почему мне интересно, есть ли у него способ сделать это... Я прочитал и протестировал ответ kcoppock, но он по-прежнему не работает.

Любое предложение?

ИЗМЕНИТЬ

Главное, что я хотел сделать, это подключить мой Bluetooth автоматически, но так как я читал в Привет, вы отвечаете... Я понял это и я знаю, что это ошибка Android, поэтому я хотел бы сделать это, выбрав paired devices, а затем щелкнуть по устройству, которое я хочу подключить (без каких-либо Intent) и подключите его, вместо этого, чтобы перейти Configuration/Bluetooth/.... Btw Я прочитал ответы на StackOverflow, и я нашел что-то с Sockets, они использовались для подключения Bluetooth? Может быть это решение?

Ответ 1

Изменить ответ на последний вопрос

Вы можете избежать использования намерения для поиска сопряженных устройств. При подключении к устройству, которое не спаривается, выдается уведомление о необходимости подключения устройств. После спаривания это сообщение не должно отображаться снова для этих устройств, соединение должно быть автоматическим (в соответствии с тем, как вы написали свою программу).

Я использую намерение включить bluetooth, и чтобы мое устройство было доступно для обнаружения, я затем установил свой код для подключения и нажмите кнопку для подключения. В вашем случае вам нужно будет убедиться, что ваши аксессуары также доступны для поиска. В моем случае я использую уникальный UUID, и оба устройства должны признать это для соединения. Это можно использовать только в том случае, если вы программируете оба устройства, независимо от того, являются ли они андроидом или одним андроидом и другим типом устройства.

Попробуйте это и посмотрите, разрешает ли он вашу проблему.


Это ответ на исходный вопрос, прежде чем он был изменен, чтобы стать другим вопросом.

Я отредактировал свой ответ для ясности, как я вижу из комментариев, которые вводят в заблуждение. Ваш вопрос состоит из двух частей.

В моем MotoG (KitKat), если я переверну свой Bluetooth, он автоматически подключается к устройству (если оно близко и сопряжено с...), но на моем LG G3 мне нужно идти к Конфигурации/Bluetooth/Сопряженные устройства/и нажмите на устройство, чтобы connect... и я хочу избежать этого... должно быть возможно?

Это проблема программирования и проблема с платформой.
В Android 5.0 имеется хорошо документированная ошибка, поскольку Bluetooth не подключается автоматически и многие другие проблемы с BT. Эти проблемы продолжаются со всеми обновлениями 5.0. версии и не фиксируется до 5.1. Обновить.

http://www.digitaltrends.com/mobile/android-lollipop-problems/11/

http://forums.androidcentral.com/lg-g3/473064-bluetooth-streaming-choppy-lg-3-lollipop.html

Первый порт вызова - обновить до 5.1

Эти проблемы были рассмотрены в обновлении Lollipop 5.1

http://www.reddit.com/r/Android/comments/306m3y/lollipop_51_bluetooth/


Edit: Я не думаю, что это исправит вашу проблему автоматического спаривания, вы хотели бы знать, как использовать BTGatt.

Я видел, если я набираю устройство. проверить, что я могу сделать это, позвольте мне connectGatt() означает /.../ Но я не могу понять, как это сделать...

Использовать BluetoothGatt

https://developer.android.com/reference/android/bluetooth/BluetoothGatt.html

Этот класс предоставляет функциональность Bluetooth GATT для включения связь с устройствами Bluetooth Smart или Smart Ready.  /.../ Устройства, поддерживающие GATT, могут быть обнаружены с помощью устройства Bluetooth обнаружения или BLE-сканирования.

https://developer.android.com/reference/android/bluetooth/BluetoothGattCallback.html

Вот отличный пример использования BluetoothGatt (он использует скорость прослушивания):
https://github.com/googlesamples/android-BluetoothLeGatt/blob/master/Application/src/main/java/com/example/android/bluetoothlegatt/BluetoothLeService.java

Я воспроизвел часть кода здесь, в случае, если ссылка замирает.

В основном это соответствует аналогичным строкам обычного соединения Bluetooth. Вам необходимо найти и найти поддерживаемые устройства. Состояние монитора и т.д.
Это две наиболее подходящие функции для gatt.

Обратный вызов:

// Implements callback methods for GATT events that the app cares about.  For example,
// connection change and services discovered.
private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
        String intentAction;
        if (newState == BluetoothProfile.STATE_CONNECTED) {
            intentAction = ACTION_GATT_CONNECTED;
            mConnectionState = STATE_CONNECTED;
            broadcastUpdate(intentAction);
            Log.i(TAG, "Connected to GATT server.");
            // Attempts to discover services after successful connection.
            Log.i(TAG, "Attempting to start service discovery:" +
                    mBluetoothGatt.discoverServices());

        } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
            intentAction = ACTION_GATT_DISCONNECTED;
            mConnectionState = STATE_DISCONNECTED;
            Log.i(TAG, "Disconnected from GATT server.");
            broadcastUpdate(intentAction);
        }
    }

    @Override
    public void onServicesDiscovered(BluetoothGatt gatt, int status) {
        if (status == BluetoothGatt.GATT_SUCCESS) {
            broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED);
        } else {
            Log.w(TAG, "onServicesDiscovered received: " + status);
        }
    }

    @Override
    public void onCharacteristicRead(BluetoothGatt gatt,
                                     BluetoothGattCharacteristic characteristic,
                                     int status) {
        if (status == BluetoothGatt.GATT_SUCCESS) {
            broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
        }
    }

    @Override
    public void onCharacteristicChanged(BluetoothGatt gatt,
                                        BluetoothGattCharacteristic characteristic) {
        broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
    }
};

Трансляция:

private void broadcastUpdate(final String action,
                             final BluetoothGattCharacteristic characteristic) {
    final Intent intent = new Intent(action);

    // This is special handling for the Heart Rate Measurement profile.  Data parsing is
    // carried out as per profile specifications:
    // http://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.heart_rate_measurement.xml
    if (UUID_HEART_RATE_MEASUREMENT.equals(characteristic.getUuid())) {
        int flag = characteristic.getProperties();
        int format = -1;
        if ((flag & 0x01) != 0) {
            format = BluetoothGattCharacteristic.FORMAT_UINT16;
            Log.d(TAG, "Heart rate format UINT16.");
        } else {
            format = BluetoothGattCharacteristic.FORMAT_UINT8;
            Log.d(TAG, "Heart rate format UINT8.");
        }
        final int heartRate = characteristic.getIntValue(format, 1);
        Log.d(TAG, String.format("Received heart rate: %d", heartRate));
        intent.putExtra(EXTRA_DATA, String.valueOf(heartRate));
    } else {
        // For all other profiles, writes the data formatted in HEX.
        final byte[] data = characteristic.getValue();
        if (data != null && data.length > 0) {
            final StringBuilder stringBuilder = new StringBuilder(data.length);
            for(byte byteChar : data)
                stringBuilder.append(String.format("%02X ", byteChar));
            intent.putExtra(EXTRA_DATA, new String(data) + "\n" + stringBuilder.toString());
        }
    }
    sendBroadcast(intent);
}

В этом вопросе также есть соответствующий код, который может помочь сократить его при обучении:
Bluetooth-звонок Gatt не работает с новым API для Lollipop

Теперь вот руб. Являются ли ваши устройства bluetooth умными или умными?

Эта ссылка дает отличный список интеллектуальных устройств. Вы также узнаете, когда реализуете свою программу.

http://www.bluetooth.com/Pages/Bluetooth-Smart-Devices-List.aspx

Ответ 2

Вот как я сделал эту работу, используя Java Reflection и BluetoothProfile:

Атрибуты:

private boolean mIsConnect = true;
private BluetoothDevice mDevice;
private BluetoothA2dp mBluetoothA2DP;
private BluetoothHeadset mBluetoothHeadset;
private BluetoothHealth mBluetoothHealth;

Вызов:

mBluetoothAdapter.getProfileProxy(getApplicationContext() , mProfileListener, BluetoothProfile.A2DP);
mBluetoothAdapter.getProfileProxy(getApplicationContext() , mProfileListener, BluetoothProfile.HEADSET);
mBluetoothAdapter.getProfileProxy(getApplicationContext() , mProfileListener, BluetoothProfile.HEALTH);

СЛУШАТЕЛЬ:

private BluetoothProfile.ServiceListener mProfileListener = new BluetoothProfile.ServiceListener() {
        public void onServiceConnected(int profile, BluetoothProfile proxy) {
            if (profile == BluetoothProfile.A2DP) {
                mBluetoothA2DP = (BluetoothA2dp) proxy;
                try {
                    if (mIsConnect) {
                        Method connect = BluetoothA2dp.class.getDeclaredMethod("connect", BluetoothDevice.class);
                        connect.setAccessible(true);
                        connect.invoke(mBluetoothA2DP, mDevice);
                    } else {
                        Method disconnect = BluetoothA2dp.class.getDeclaredMethod("disconnect", BluetoothDevice.class);
                        disconnect.setAccessible(true);
                        disconnect.invoke(mBluetoothA2DP, mDevice);
                    }
                }catch (Exception e){
                } finally {
                }
            } else if (profile == BluetoothProfile.HEADSET) {
                mBluetoothHeadset = (BluetoothHeadset) proxy;
                try {
                    if (mIsConnect) {
                        Method connect = BluetoothHeadset.class.getDeclaredMethod("connect", BluetoothDevice.class);
                        connect.setAccessible(true);
                        connect.invoke(mBluetoothHeadset, mDevice);
                    } else {
                        Method disconnect = BluetoothHeadset.class.getDeclaredMethod("disconnect", BluetoothDevice.class);
                        disconnect.setAccessible(true);
                        disconnect.invoke(mBluetoothHeadset, mDevice);
                    }
                }catch (Exception e){
                } finally {
                }
            } else if (profile == BluetoothProfile.HEALTH) {
                mBluetoothHealth = (BluetoothHealth) proxy;
                try {
                    if (mIsConnect) {
                        Method connect = BluetoothHealth.class.getDeclaredMethod("connect", BluetoothDevice.class);
                        connect.setAccessible(true);
                        connect.invoke(mBluetoothHealth, mDevice);
                    } else {
                        Method disconnect = BluetoothHealth.class.getDeclaredMethod("disconnect", BluetoothDevice.class);
                        disconnect.setAccessible(true);
                        disconnect.invoke(mBluetoothHealth, mDevice);
                    }
                }catch (Exception e){
                } finally {
                }
            }
        }
        public void onServiceDisconnected(int profile) {
        }
    };

Я надеюсь, что это поможет любому, кто пытается подключиться к Bluetooth Audio устройствам и гарнитурам.