2012-08-22 4 views
5

OBP OBP (Object Push Profile)를 사용하여 Bluetooth를 통해 데이터를 보내는 장치가 있습니다.OBEX 개체를 통해 Bluetooth로 파일 받기 PushProfile

(이 연결을하지만 중단?) 난 내 안드로이드 장치가 연결을 수신하는 것을 볼 ADB 로그 캣을 사용하여 내가 블루투스 파일 전송 (시장에서 무료 응용 프로그램)을 설치

08-22 11:14:37.939: I/BtOppRfcommListener(22586): Accepted connectoin from 00:07:CF:5F:52:A0 
08-22 11:14:37.939: I/BtOpp Service(22586): Start Obex Server 
08-22 11:14:38.109: D/Obex ServerSession(22586): java.io.IOException: Software caused connection abort 
08-22 11:14:38.109: D/PowerManagerService(180): @PowerManagement: 'BtOppObexServer' releaseWakeLock when screen locked 
08-22 11:14:39.219: D/BluetoothEventLoop(180): Device property changed: 00:07:CF:5F:52:A0 property: Connected value: false 

다음 내가 파일을받을 수 있어요 . 하지만 다른 응용 프로그램을 설치하고 싶지 않습니다.

+0

코드를 게시하여 문제의 코드를 게시하면 안드로이드 전문가가 볼 수 있습니다. 전자 문제? –

+0

도움이 되나요? http://stackoverflow.com/questions/3625959/android-rfcomm-with-obex-push-not-working – domsom

+0

@domsom 나는 이미 성공하지 않고 비슷한 코드를 시도했다. IMO 문제는 기본 Bluetooth가 여전히 들어오는 OPP 데이터를 받아들이고 사용자 지정 코드가 트리거되지 않는다는 것입니다. 따라서 솔루션은 들어오는 연결을 청취하는 것뿐만 아니라 네이티브 블루투스에 '등록'하여 사용자 지정 OPP 처리기가 호출되도록해야합니다. –

답변

2

나는 OPP와 사용자 지정 코드를 통해 파일을 가로채는 것을 허용해야한다는 (적어도 부분적인) 해결책이 있다고 생각한다. 첫 번째 단계는 실행> 설정> 애플리케이션으로 이동하는 것입니다> 블루투스 공유하고 BluetoothOppService

가 그럼 난 특정 포트에서 수신 할 수 있습니다 BluetoothAdapter (아래 코드)의 메소드에 액세스하는 반사를 사용 죽인다. 그 후에 우리는 들어오는 OPP 통신을 가로 채고 입출력 스트림과 상호 작용할 수 있습니다. This SO 스레드가 OPP 통신 부분 도움이되지만 초기 단계로 나 데이터 스트림을 읽고 os.writeByte(ObexSession.OBEX_SUCCESS | ObexSession.OBEX_FINAL_BIT);

// simplified exception handling 
public class BluetoothAdapterProxy 
{ 
    public static final int CHANNEL_OPP = 12; 

    final BluetoothAdapter target; 
    static final Class<?> targetClass = BluetoothAdapter.class; 
    Method listenOn; 

    public BluetoothAdapterProxy(BluetoothAdapter target) 
    { 
     this.target = target; 
     Class<?>[] args = new Class[] { int.class }; 
     try 
     { 
      this.listenOn = targetClass.getDeclaredMethod(
       "listenUsingRfcommOn", args); 
     } 
     catch (NoSuchMethodException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    public BluetoothServerSocket listenUsingRfcommOn(int channel) 
    { 
     try 
     { 
      return (BluetoothServerSocket) (listenOn.invoke(target, 
       new Object[] { channel })); 
     } 
     catch (Exception e) 
     { 
      // complain loud, complain long 
      throw new RuntimeException(ex); 
     } 
    } 
} 

사용 즉, OPP에 'OK'메시지와 함께 reponded : 사용하여 초기화

serverSocket = new BluetoothAdapterProxy(BluetoothAdapter.getDefaultAdapter()) 
    .listenUsingRfcommOn(BluetoothAdapterProxy.CHANNEL_OPP); 

그 후 별도의 Thread (차단을 막기 위해)을 사용하고 원격 장치는 다음을 통해 연결할 수 있습니다 socket = serverSocket.accept();

+0

왜 이런 래퍼 클래스가 필요한지 모르겠지만 OPP UUID'00001105-0000-1000-8000-00805f9b34fb'를 사용하여 공개'BluetoothDevice.listenUsingRfcommWithServiceRecord()'메서드를 사용할 수 있습니다. 문제의 핵심은 아마도 다른 (시스템) 서비스가 이미 OBEX 채널에서 수신 대기하고 있다는 것입니다. 그래서 당신이 진술 한 "kill"솔루션으로 살 수 있거나, 시스템 서비스를 사용하여 다음과 같이 모니터링 할 수 있습니다. http://stackoverflow.com/questions/3625959/android-rfcomm-with-obex-push-not- – domsom

+0

래퍼 클래스는 '숨겨진 android api'에서 런타임에 표시되지만 게시 된 API 및 android.jar에서 제외되는 코드에 액세스하는 데 사용됩니다. 게시 된 API를 탐색하는 데 많은 양의 테스트 코드가 있습니다.하지만 리스닝은 문제가되지 않지만 외부 OPP 데이터에 응답하는 맞춤 코드를 사용할 수있는 시도는 없습니다. –

+0

다른 장치에서 여전히 다르게 동작하는 것을 발견 했으므로 게시 된 샘플 코드는 완전한 솔루션이 아닙니다. HTC One X에서 OPP를 통해 데이터를 수신 할 수는 있지만 Samsung Nexus S 및 Galaxy Tab 2에서는 다르게 작동하고 완전히 작동하지 않습니다. –