2014-12-24 2 views
3

방금 ​​Android로 시작하여 Android LE에서 Bluetooth LE를 사용하여 API 21 프로젝트를 설정했습니다. BluetoothDevice에 파고전송 매개 변수가있는 BluetoothDevice.ConnectGatt()

은() 메소드 나에게 ConnectGatt 두 서명을 보여줍니다

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

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

내가 두 번째를 사용하고 싶지만 빌드가 실패

Error:(127, 26) error: method connectGatt in class BluetoothDevice cannot be applied to given types; required: Context,boolean,BluetoothGattCallback found: Context,boolean,BluetoothGattCallback,int reason: actual and formal argument lists differ in length

컴파일러 설정이 Android Studio의 소스 코드와 일치하지 않는 것 같습니다.

어떻게 해결할 수 있습니까?

답변

3

업데이트 !!! 나는 우리를 너무 괴롭히는이 결점을 피할 수있는 길을 발견했을 것입니다. 안드로이드는 L2CAP 채널 5 연결을 기본값으로하기 때문에 iOS는 거부합니다. 이것은 iOS 광고 패킷에서 BR/EDR을 나타내는 비트 플래그 때문입니다.

안드로이드 코드 검토 connectGatt() 함수에는 AUTO 또는 특정 LE 또는 BR/EDR 만 사용할 수있는 숨겨진 int TRANSPORT 변수가 있습니다.

어떤 이유인지, Android Studio의 BluetoothDevice.java 파일에서 사용할 수 있지만 안드로이드 코드 참조에는 나와 있지 않습니다. 이것을 사용하려고 시도하면 오류가 발생합니다. 누군가가 우리가 사용하고있는 TANSPORT_AUTO 대신 TRANSPORT_LE 옵션을 사용하여 코드를 컴파일하기 위해 android studio에서 컴파일러를 고칠 수있는 방법을 설명 할 수 있다면.

이 글은 다시 사용 가능합니다.

4

숨겨진 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 
     }