2011-03-15 2 views
18

나는 rfec 소켓을 불안전하게 연결하는 방법을보고있다. 아래에 언급 된 방법을 찾을 수있었습니다.안드로이드에서 안전하지 않은 RFCOMM 소켓을 만드는 방법은 무엇입니까?

Method m = device.getClass().getMethod("createInsecureRfcommSocket", new Class[] {int.class}); 
tmp = (BluetoothSocket) m.invoke(device, 1); 

당분간은 내가 원하는 것을하고 있습니다. 심지어 here 이상의 문서에서도 안전하지 않은 연결을 위해 createInsecureRfcommSocketToServiceRecord를 사용해야한다고 말합니다. 그러나 그런 방법은 없습니다. 내가 발견 한 유일한 방법은 위와 같이 반사를 사용하는 것입니다. 그리고 createInsecureRfcommSocketToServiceRecord가 아닌 createInsecureRfcommSocket에 전달되는 메서드도 마찬가지입니다. 이 방법이 얼마나 신뢰할 수 있는지 알고 싶었습니다. 메서드에서 createInsecureRfcommSocketToServiceRecord를 언급하면 ​​연결은 결코 발생하지 않습니다.

답변

29

createInsecureRfcommSocketToServiceRecord() 안드로이드 API 레벨 10로 시작 포함되어 본 적이, 그래서 문서는 문서가 항상 최신 버전의 API를 따라 이후를 사용하는 것이 좋습니다 것입니다. 10보다 낮은 API (2.3.3 또는 진저 브레드)를 타겟팅하는 경우 해당 메소드는 공개적으로 액세스 할 수 없습니다.

리플렉션 createInsecureRfcommSocket()을 통해 호출하는 방법은 약 안드로이드 2.0부터 제공된 BluetoothDevice 내부의 개인 방법입니다. 숨겨진 메소드를 호출 할 때의 문제점은 모든 디바이스에 또는 미래에있을 수 있다는 보장이 없다는 것입니다. 따라서 당신은 조금 도박을하고 있습니다. 내 생각에 당신의 방법은 대중의 사촌 createRfcommSocketToServiceRecord()을 구현하는 데 필요한 서비스가 스택 계층에서 매우 유사하기 때문에 대부분의 2.0+ 장치에서 대부분의 시간 동안 작동 할 것입니다.

결론 블루투스 구현과의 보편적 호환성을 보장하려면 애플리케이션에 2.3.3 (API 레벨 10)을 타겟팅해야합니다. 안전하지 않은 RFCOMM에 공개 된 공개 API를 사용하면 기본 구현이 변경 될 가능성이 있는지 여부를 말하기 어렵습니다.

+0

올바른 방향으로 안내해 주셔서 감사합니다. 이 API가 API 레벨 10 이후로만 제공되는 경우 안드로이드 2.1 – sunil

+3

ATM으로 개발할 경우 장치를 안전하지 않게 연결하는 방법을 사용하면 가장 좋은 방법을 찾을 수 있습니다. 리플렉션 솔루션은 이후 버전에서 사라질 수 있으므로'Build.VERSION'을 사용하여 장치의 버전을 확인하고 2.3 이상에서 공용 API를 사용하도록 코드를 작성할 수 있습니다.이렇게하려면 타겟 API 레벨을 10으로 높이고 최소 API 레벨을 5 (또는 7)로 두어 이전 2.1 또는 2.2 기기에서 계속 실행되도록합니다. 희망이 도움이됩니다! – Devunwired

+0

@ Wireless는 아니지만 API 7의 createInsecureRfcommSocketToServiceRecord() 메소드와 함께 작동합니까? –

5

대부분의 답변은 2011 년 3 월 30 일 이전입니다.

내 응용 프로그램에서 비슷한 문제의 해결책을 찾고있는 동안, 나는 여전히 SO

http://mobisocial.stanford.edu/news/2011/03/bluetooth-reflection-and-legacy-nfc/에이 문제의 해결책을 찾고있는 모든 사람들을 도움이 될 것입니다

월 30 일 작성된이 블로그를 발견했다

이 솔루션은 매우 단순 해졌습니다. 프로젝트에 InsecureBluetooth.java를 포함시키고 BluetoothChatService.java에서 2 줄만 변경하십시오.

tmp = InsecureBluetooth.listenUsingRfcommWithServiceRecord(mAdapter, NAME, MY_UUID, true); 

tmp = InsecureBluetooth.createRfcommSocketToServiceRecord(device, MY_UUID, true); 

그게 전부를!

+4

링크가 404입니다. – Rafay

관련 문제