我正在尝试编写一个通过蓝牙低功耗发送消息的应用程序,然后由我的外设中的UART传递.我按照这里的步骤操作,应用程序扫描并成功找到设备.但是,使用BluetoothGatt = BluetoothDevice.connectGatt(上下文,自动连接,回调)方法的连接失败,logcat说"无法注册回调".
来自:
//device scan callback
private BluetoothAdapter.LeScanCallback btScanCallback = new BluetoothAdapter.LeScanCallback()
{
@Override
public void onLeScan(final BluetoothDevice device, final int rssi, final byte[] scanRecord)
{
some stuff
currBtGatt = device.connectGatt(parentActivity, false, btGattCallback);
}
};
Run Code Online (Sandbox Code Playgroud)
和Gatt回调:
//GATT callback
private BluetoothGattCallback btGattCallback = new BluetoothGattCallback()
{
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState)
{
// if connected successfully
if(newState == BluetoothProfile.STATE_CONNECTED)
{
//discover services
updateStatus("Connected");
gatt.discoverServices();
}
else if(newState == BluetoothProfile.STATE_DISCONNECTED)
{
updateStatus("Disconnected");
}
}
@Override …Run Code Online (Sandbox Code Playgroud) Android的蓝牙低功耗API实现1种方法连接到该设备connectGatt(),但2种方法来关闭连接disconnect()和close().
文件说:
disconnect():断开已建立的连接,或取消当前正在进行的连接尝试.
close():应用程序应在使用此GATT客户端完成后尽早调用此方法.
BluetoothGatt.java的源代码显示close()取消注册应用程序,disconnect()断开客户端连接.然而,它没有说明实际意味着什么.我的意思是,如果只有一种方法可以连接到客户端,为什么有两种方法可以关闭/断开连接?
我正在尝试连接到 Android 上的蓝牙设备。我在onClientConnectionState处理程序中收到状态 133 。我并不总是收到此错误 - 有时它连接正常。我一直无法确定是什么触发了问题。我什至在重新启动设备和我的 repro 应用程序后立即拥有它。
我知道这个问题的几个问题和建议的解决方案,包括(来自这里、这里和这里):
但我正在做这一切。更重要的是,我的设备是 Nexus 5(运行 Lollipop),根据某些人的说法,它甚至不需要在 UI 线程上进行 BT 交互。
我已经把最简单的复制品放在一起。它在 C# 中,但 Java 等价物应该很明显:
[Activity(Label = "BluetoothGatt133ErrorRepro", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
protected override void OnCreate(Android.OS.Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.Main);
var button = FindViewById<Button>(Resource.Id.button);
button.Click += this.OnClick;
}
private async void OnClick(object sender, EventArgs e)
{
Action<string> log …Run Code Online (Sandbox Code Playgroud)