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

я пытаюсь программно подключить свое устройство, например, к моим наушникам... У меня было KitKat версия и все работало идеально (Bluetooth всегда был подключение без проблем autommatically), но так как я обновил до 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 Он подключается autommatically к устройству (если это рядом и в паре ОФК...) но на моем LG G3 я должен перейти к конфигурации / Bluetooth / сопряженным устройствам/ и там нажмите устройство для подключения... и я хочу избежать этого... должно быть возможно?


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

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

редактировать

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

2 ответов


Edit, чтобы ответить на последний вопрос

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

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

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


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

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

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

Это меньше проблема программирования и больше проблема платформы.
Есть хорошо документированная ошибка в 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 (он использует hear rate):
https://github.com/googlesamples/android-BluetoothLeGatt/blob/master/Application/src/main/java/com/example/android/bluetoothlegatt/BluetoothLeService.java

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

он в основном следует аналогичным линиям обычного соединения bluetooth. Вы должны обнаружить и найти поддерживаемые устройства. Следить за состоянием и т. д.
Это две наиболее важные особенности ГАТТ.

обратного вызова:

// 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 для Чупа-чупс

теперь вот в чем загвоздка. Готовы ли ваши устройства bluetooth smart или smart?

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

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


вот как я сделал эту работу, используя отражение Java и 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 аудио устройств и гарнитур.