2011-04-24 3 views
3

지금 고전적인 Google 블루투스 채팅 코드를 사용하여 블루투스 연결을 구현했습니다. 그러나, 나는 내 뇌를 감쌀 수없는 질문을 가지고있다.안드로이드 블루투스 파일 전송에서 EOF를 탐지하는 방법은 무엇입니까?

입력 스트림의 읽기는 이런 식입니다 :

public void run() { 
    byte[] buffer = new byte[1024]; // buffer store for the stream 
    int bytes; // bytes returned from read() 

    // Keep listening to the InputStream until an exception occurs 
    while (true) { 
     try { 
      // Read from the InputStream 
      bytes = mmInStream.read(buffer); 
      // Send the obtained bytes to the UI Activity 
      mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer) 
        .sendToTarget(); 
     } catch (IOException e) { 
      break; 
     } 
    } 
} 

을 지금, 난 그냥 원래의 예에서와 같이 수신 된 문자를 인쇄 할 경우 그 괜찮습니다. 그러나 이미지 파일을 전송하려고한다고 가정합니다. 나는 파일의 크기를 모른다. 그래서 나는받은 바이트 수를 계산할 수 없다. 테스트에서 입력 스트림에서 "-1"을받는 것 같지 않습니다. 입력 스트림에서 읽기에 대한 "표준"인 것처럼 보입니다. 그러면 내가 보낸 파일의 끝에 도달했음을 어떻게 알 수 있습니까?

도와 주셔서 감사합니다.

답변

2

안드로이드 블루투스 입력 스트림이 -1을 반환하지 않는 것 같습니다.

처음에는 파일 크기를 보내서 간단한 프로토콜을 설정하고 EOF 신호가 도움이 될 것 같습니다.

+0

내가 그런 경우가있을 수 있습니다 생각하지만 내가 내려다 보이는 한 간단한 방법이 있다면보고 싶었어요. 하지만 내가 뭘해야하는지 확인 했어. 고마워! –

1

while ((bytes = mmInStream.read(buffer) != -1) 

을 시도하고 도움이되는지 확인합니다.

2

아니요. 안드로이드는 소켓이 내가 아는 한 닫힌 경우에만 -1을 보냅니다. 그래서 해결 방법을 할 수있는 재 연결을 할 수 있지만 그 시간 동안 노력하고 그것을 이해하지 못했기 때문에, 나는이 "특수"코드 (Stackoverflow 스레드에서 복사 한) 소켓을 설정하는 이해하지 못하기 때문에 :

 BluetoothSocket tmp = null; 
    Log.d(TAG, "New Connection initialized"); 
    Method m; 
    try { 
     m = device.getClass().getMethod("createRfcommSocket", 
       new Class[] { int.class }); 
     tmp = (BluetoothSocket) m.invoke(device, 1); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    mmSocket = tmp; 

이 소켓은 응용 프로그램이 첫 번째 파일 전송을 시작할 때만 작동합니다. 완전히 새로운 인스턴스화 된 Object (그리고 그 코드로 생성 된 새로운 소켓)로 "재접속"을 원할 경우, 프로그램은 blocking 메소드 인 mmSocket.connect()에서 정지합니다. 방법이 결말에 결코 오지 않는 것처럼 보인다. 이

1

이 시도 ... 나를 미치게된다

 public void run() { 
     byte[] buffer; 
     ArrayList<Integer> arr_byte = new ArrayList<Integer>(); 
     while (true) { 
      try { 
       int data = mmInStream.read(); 
       if(mmInStream.available()>0) { 
        arr_byte.add(data); 
       } else { 
        arr_byte.add(data); 
        buffer = new byte[arr_byte.size()]; 
        for(int i = 0 ; i < arr_byte.size() ; i++) { 
         buffer[i] = arr_byte.get(i).byteValue(); 
        } 
        Log.e("INPUT",new String(buffer)); 
        mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer) 
          .sendToTarget(); 
        arr_byte = new ArrayList<Integer>(); 
       } 
      } catch (IOException e) { 
       break; 
      } 
     } 
    } 
관련 문제