4

Android を使い始めたばかりで、Bluetooth LE を使用して Android Studio で API 21 プロジェクトをセットアップしました。

BluetoothDevice を掘り下げると、ConnectGatt() メソッドの 2 つの署名が表示されます。

public BluetoothGatt connectGatt(Context context, boolean autoConnect,
                                 BluetoothGattCallback callback)

public BluetoothGatt connectGatt(Context context, boolean autoConnect,
                                 BluetoothGattCallback callback, int transport)

2 番目のものを使用したいのですが、ビルドが失敗します。

エラー:(127, 26) エラー: クラス BluetoothDevice のメソッド connectGatt は、指定された型に適用できません。必須: Context,boolean,BluetoothGattCallback 見つかりました: Context,boolean,BluetoothGattCallback,int 理由: 実引数リストと仮引数リストの長さが異なります

コンパイラの設定が Android Studio のソース コードと一致していないようです。

どうすればこれを修正できますか?

4

3 に答える 3

6

非表示の API を使用する場合は、使用するメソッドを呼び出すことができます。ただし、隠し API はいつでも変更できることに注意してください。自己責任で使用する必要があります。

非表示の connectGatt() メソッドを使用するコード例を次に示します。

        Method connectGattMethod;
        BluetoothGatt connectGatt;

        try {
            connectGattMethod = device.getClass().getMethod("connectGatt", Context.class, boolean.class, BluetoothGattCallback.class, int.class);
        } catch (NoSuchMethodException e) {
          //NoSuchMethod
        }

        try {
            connectGatt = (BluetoothGatt) connectGattMethod.invoke(device, this, false, mBluetoothGattCallback, 2); // (2 == LE, 1 == BR/EDR)
        } catch (IllegalAccessException e) {
            //IllegalAccessException
        } catch (IllegalArgumentException e) {
            //IllegalArgumentException
        } catch (InvocationTargetException e) {
            //InvocationTargetException
        }
于 2015-01-15T10:37:12.163 に答える
3

アップデート!!!私たちを悩ませているこの欠陥を回避する方法を見つけたかもしれません。Android はデフォルトで L2CAP チャネル 5 で iOS に接続するため、接続を拒否します。これは、BR/EDR を示す iOS アドバタイジング パケットのビット フラグによるものです。

Android コードを確認すると、connectGatt() 関数には隠し int TRANSPORT 変数があり、AUTO または特定の LE または BR/EDR のみを使用できることがわかりました。

何らかの理由で、これは Android Studio の BluetoothDevice.java ファイルで利用できますが、Android コード リファレンスには記載されていません。これを使用しようとすると、エラーが発生します。Androidスタジオでコンパイラを修正して、使用されていると思われるTANSPORT_AUTOの代わりにTRANSPORT_LEオプションを使用してコードをコンパイルする方法を誰かが説明できる場合。

よし、これで再開だ、仕事に取り掛かろう!

于 2015-01-01T18:47:21.980 に答える