AndroidのBluetoothデバイスに接続しようとしています。私はonClientConnectionState
ハンドラにステータス133を受け取りました。私はいつもこのエラーが出るとは限りません。私は問題を引き起こすものに指を置くことができませんでした。私はデバイスと私のreproアプリケーションを再起動した直後にもそれを持っていた。Android Bluetoothエラー133
、私はいくつかの質問を認識だと(here、here、およびhereから)を含め、この問題に対する解決策を提案した:
- すべてのBTのAPI
- ためのUIスレッドが閉じるようにしてください使用GATTが完了したら
しかし、私はそれをすべてやっています。さらに、私のデバイスは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 = 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);
}
}
}
そして、ここで(私もAndroidの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
Bluetoothスタックとの私のすべてのやりとりは、メインスレッド(#1)で発生しています。しかしそれにもかかわらず、onClientConnectionState
ハンドラにステータス133が届いています。
私のマニフェストには、これらの権限を持っている:
<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" />
私は、最新のマシュマロツールでコンパイルしていて、4.0.3(APIレベル15)の最小目標とマシュマロをターゲットにしています。
これは何が原因でしょうか?
マニフェストファイルにどのような権限があるか教えてください。また、接続を試みる前にスキャンを停止することもできますか? – Zomb
^^ upvotedスキャンの提案を停止するために、そのことに気付かなかった – Submersed
@ Zomb私の質問に詳細を追加しました。それは明らかに今朝私のためにうまくいきますが、次回このポップアップでスキャントリックを止めてみる必要があります。 –