Подключение к 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 аудио устройств и гарнитур.