Android에서 블루투스 장치에 연결하려고합니다. 내 onClientConnectionState
처리기에 상태 133이 전송됩니다. 항상이 오류가 발생하는 것은 아닙니다. 때로는 제대로 연결됩니다. 나는 문제를 일으키는 것에 손가락을 대지 못했습니다. 장치 및 내 repro 응용 프로그램을 다시 시작한 후 즉시 그것을했습니다.Android 블루투스 오류 133
- 는
- 하는 닫아야합니다 모든 BT API를위한 UI 스레드를 사용
나는 (here, here 및 here에서) 몇 가지 질문 알고 있어요 포함하여,이 문제에 대한 해결책을 제시 GATT가 완료되면
그러나 나는 그것을 모두하고있다. 또한 내 기기는 Nexus 5 (Lollipop을 실행 중)인데, 일부 사용자는 BT 상호 작용이 UI 스레드에 있어야하지 않아야합니다.
나는 가능한 가장 간단한 repro을 조립했습니다. 그것은 C#에서의하지만 자바 상당 명백해야한다 :
[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 = message => Console.WriteLine($"***** #{Environment.CurrentManagedThreadId} {message}");
log("Beginning");
var bluetoothManager = (BluetoothManager)Application.Context.GetSystemService(Context.BluetoothService);
var adapter = bluetoothManager.Adapter;
var scanner = adapter.BluetoothLeScanner;
var callback = new Callback();
var filters = new List<ScanFilter>();
var settings = new ScanSettings.Builder()
.SetScanMode(global::Android.Bluetooth.LE.ScanMode.LowLatency)
.Build();
log("Starting scan");
scanner.StartScan(filters, settings, callback);
var result = await callback.Result;
log($"Got device: {result.Device.Name}");
var remoteDevice = adapter.GetRemoteDevice(result.Device.Address);
var gattCallback = new GattCallback(log);
log("Connecting GATT");
var gatt = remoteDevice.ConnectGatt(Application.Context, true, gattCallback);
gatt.Connect();
await gattCallback.Result;
log("Disconnecting GATT");
gatt.Close();
gatt.Dispose();
}
private sealed class Callback : ScanCallback
{
private readonly TaskCompletionSource<ScanResult> result;
public Callback()
{
this.result = new TaskCompletionSource<ScanResult>();
}
public Task<ScanResult> Result => this.result.Task;
public override void OnBatchScanResults(IList<ScanResult> results)
{
foreach (var result in results)
{
this.HandleResult(result);
}
}
public override void OnScanResult(ScanCallbackType callbackType, ScanResult result)
{
this.HandleResult(result);
}
public override void OnScanFailed(ScanFailure errorCode)
{
this.result.TrySetException(new InvalidOperationException($"Failed with error code {errorCode}."));
}
private void HandleResult(ScanResult result)
{
if (result.Device.Name.Contains("elided"))
{
this.result.TrySetResult(result);
}
}
}
private sealed class GattCallback : BluetoothGattCallback
{
private readonly Action<string> log;
private readonly TaskCompletionSource<bool> result;
public GattCallback(Action<string> log)
{
this.log = log;
this.result = new TaskCompletionSource<bool>();
}
public Task<bool> Result => this.result.Task;
public override void OnConnectionStateChange(BluetoothGatt gatt, GattStatus status, ProfileState newState)
{
this.log($"Connection state changed to {newState} with status {status}.");
this.result.TrySetResult(true);
}
}
}
그리고 여기에 (내가 너무 안드로이드의 BluetoothGatt 소스의 출력에 남아있는 것)이 실행의 출력을 : 당신이 할 수
***** #1 Beginning
***** #1 Starting scan
07-01 11:53:21.458 D/BluetoothLeScanner(10377): onClientRegistered() - status=0 clientIf=5
***** #1 Got device: elided
***** #1 Connecting GATT
07-01 11:53:22.833 D/BluetoothGatt(10377): connect() - device: 00:00:DE:AD:BE:EF, auto: true
07-01 11:53:22.833 D/BluetoothGatt(10377): registerApp()
07-01 11:53:22.833 D/BluetoothGatt(10377): registerApp() - UUID=fa5bce8a-416d-47fe-9a8a-e44156f7e865
07-01 11:53:22.834 D/BluetoothGatt(10377): onClientRegistered() - status=0 clientIf=6
07-01 11:53:24.622 D/BluetoothGatt(10377): onClientConnectionState() - status=133 clientIf=6 device=00:00:DE:AD:BE:EF
***** #4 Connection state changed to Disconnected with status 133.
***** #1 Disconnecting GATT
07-01 11:53:24.707 D/BluetoothGatt(10377): close()
07-01 11:53:24.707 D/BluetoothGatt(10377): unregisterApp() - mClientIf=6
모든 블루투스 스택과의 상호 작용은 메인 스레드 (# 1)에서 발생합니다. 그럼에도 불구하고 내 onClientConnectionState
처리기에서 상태 133을받습니다.
내 매니페스트는 이러한 권한이 : 나는 최신 마시 멜로 도구를 사용하여 컴파일하고있어, 및 4.0.3의 최소 목표 (API 레벨 15)와 산들을 목표로하고
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
.
이 문제의 원인은 무엇입니까?
매니페스트 파일에 어떤 권한이 있는지 알려줄 수 있습니까? 또한 연결을 시도하기 전에 검사를 중지 할 수 있습니까? – Zomb
^^ 정지 검색 제안에 대해 ^^ upvoted, 그 것을 알지 못했습니다 – Submersed
@Zomb 내 질문에 대한 자세한 내용을 추가했습니다. 그것은 분명히 오늘 아침에 나를 위해 잘 작동하지만, 다음에 팝업 트릭을 멈추도록 시도해야 할 것입니다. –