2017-07-31 35 views
1

特定のデバイスでBluetoothGattに接続すると、アプリケーションに問題が発生します。Android BluetoothDevice connectGattは、特定のデバイスでエラー133で常に失敗します。

すべてのBLE関連のコードは、Serviceにあり、Huawei CAM-L03以外はすべて正常に動作します。古い三星ギャラクシーデバイスにも問題があると報告されています。

一部のデバイスでは、すべてのBLE通信をUIスレッドで実行する必要があることが最近発見されました。私は簡単なテストアプリケーションを書いて、Huaweiの問題はすべてがUIスレッド上で動くと消えてしまいます。

私が作成しようとした主なルーパーとServiceHandler

final Context context = getApplicationContext(); 
Handler handler = new Handler(context.getMainLooper()); 
handler.post(new Runnable(){ 
    @Override 
    public void run() { 
     BluetoothGatt gatt = device.connectGatt(context, false, callBackHandler); 
     … 
    } 
}); 

しかし、それはまだコンテキストがサービスであるため、私は一種の疑いの接続コールバック、中に私GATT_ERROR 133を与え、 UIアプリではありません。

私はここでは2つのオプションを参照してください。すべてのデバイスをサポートするために、特定のデバイスにUIアプリへ

  • 移動のすべてをサポートしていません。

    1. リスト項目を

    私が持つコンテンツではありませんよこれらのいずれか。私が知らない他の選択肢はありますか?

  • +0

    代わりにrunOnUiThreadを使用してみてください。あなたはアクティビティのインスタンスが必要です – Zoe

    +0

    それは事です、私はアクティビティにアクセスできません。 – unexplored

    +0

    コールを実行しているスレッドに応じて、Bluetoothコールの動作を区別する方法はありません。 AndroidのBluetooth APIは、Androidの「バインダー」機能を使用してBluetoothサービスと通信します。エラーコード133は、成功しなかったという一般的なエラーコードです。 onConnectionChangeコールバックでエラーコード133が最も一般的な理由の1つは、接続試行がタイムアウトしたためです。 – Emil

    答えて

    1

    私は問題が実際にどのようなものか、それを解決する方法を考え出しました。私は同じ問題にヒントを見つけられなかったので、接続試行時に発生する一般的なgattエラー(133)の別のチェックとして自分の答えを追加します。

    私はthisのような答えで間違った結論に導かれました。私はバグがAndroidで長い間修正されていたと思う。私が接続に失敗したコールバックを取得しているという事実は、コールバックが登録されてからスレッドの問題が無関係だったことを示しています。

    私が直面していた問題は、BLEデバイスに接続しようとしている間にBluetoothアダプタをスキャンしたままにしていたという事実に関連していました。一部の電話機には問題があるようです。

    私のアプリケーションの要件は、サービスが実行されている時間、および私が周囲に持っていたすべてのテスト用の電話機に問題がないことを継続的に調べることです。しかし、HUAWEIのこのモデルは、接続を拒否します。

    TL; DR接続を試みる前にスキャンを停止し、切断後に必要に応じてスキャンを再開してください。

    +1

    はい、我々はこれにも気がついていますが、1つの電話機、すなわちHuawei P8 Liteだけで気づいています。この問題が発生している携帯電話はどれですか? – Emil

    +0

    @エミール私は、Huawei CAM-L03の質問でそれを述べました。私たちはいくつかのHTCデバイスで同じ問題を抱えていると思っていますが、私はそれがないので確認できません。 – unexplored

    +0

    ああ申し訳ありませんが、私はそれを逃した。とにかく、誰かが興味を持っているなら、Huawei P8 LiteのBluetoothコントローラがそこの問題の源です。ホストスタックはコントローラにスキャンと接続の両方を指示し、成功ステータスで応答します。ただし、スキャンを停止するまでは常に接続が失敗します。 – Emil

    関連する問題