2012-08-22 26 views
5

Tôi có thiết bị gửi dữ liệu qua Bluetooth bằng cách sử dụng OBEX Object Push Profile (OPP).Nhận tập tin qua Bluetooth qua OBEX Object PushProfile

Sử dụng logcat adb tôi thấy rằng thiết bị Android của tôi nhận được một kết nối (nhưng hủy bỏ kết nối này?)

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 

Khi tôi cài đặt File Transfer Bluetooth (ứng dụng miễn phí từ thị trường) sau đó tôi có thể nhận được file . Nhưng tôi không muốn cài đặt ứng dụng khác.

+0

Bạn có thể đăng mã được đề cập để các chuyên gia Android trên SO có thể xem e vấn đề? –

+0

Điều này có hữu ích không? http://stackoverflow.com/questions/3625959/android-rfcomm-with-obex-push-not-working – domsom

+0

@domsom Tôi đã thử mã tương tự mà không thành công. IMO vấn đề dường như là Bluetooth gốc vẫn chấp nhận dữ liệu OPP đến và mã tùy chỉnh không được kích hoạt. Do đó các giải pháp sẽ liên quan đến việc không chỉ lắng nghe các kết nối đến mà còn để 'đăng ký' với Bluetooth bản địa để xử lý OPP tùy chỉnh được gọi. –

Trả lời

2

Tôi tin rằng tôi có (ít nhất một phần) giải pháp mà sau đó sẽ cho phép các tệp bị chặn thông qua OPP và mã tùy chỉnh được thêm vào. Bước đầu tiên là để đi đến cài đặt> Ứng dụng> chạy> Bluetooth Chia sẻ và giết BluetoothOppService

Sau đó, tôi sử dụng phản ánh để truy cập vào một phương pháp trên BluetoothAdapter (mã dưới đây) cho phép lắng nghe trên một cổng cụ thể. Sau đó chúng ta có thể chặn các giao tiếp OPP đến và tương tác với các luồng đầu vào và đầu ra. This SO chủ đề sẽ giúp phần truyền thông OPP, nhưng như là một bước khởi đầu tôi đọc dòng dữ liệu và reponded với thông điệp một OPP 'OK' tức là 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); 
     } 
    } 
} 

Cách sử dụng: khởi sử dụng

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

Sau đó, sử dụng các mục sau từ một số riêng biệt Thread (để ngăn chặn chặn) và các thiết bị từ xa có thể kết nối qua socket = serverSocket.accept();

+0

Tôi không thấy lý do tại sao bạn cần một lớp bao bọc cho điều này, nhưng dù sao: Bạn có thể sử dụng phương thức công khai 'BluetoothDevice.listenUsingRfcommWithServiceRecord()' bằng cách sử dụng OPP UUID '00001105-0000-1000-8000-00805f9b34fb'. Chìa khóa cho vấn đề của bạn có thể là một dịch vụ (hệ thống) khác đã lắng nghe trên kênh OBEX. Vì vậy, hoặc là bạn có thể sống với giải pháp "giết" bạn đã nói, hoặc bạn sử dụng dịch vụ hệ thống và theo dõi nó như sau: http://stackoverflow.com/questions/3625959/android-rfcomm-with-obex-push-not- làm việc – domsom

+0

lớp trình bao bọc được sử dụng để truy cập phương thức từ 'api android ẩn', mã hiển thị trong thời gian chạy nhưng bị loại trừ khỏi API được xuất bản và android.jar. Tôi có một lượng lớn mã kiểm tra thăm dò API đã được xuất bản không phải là vấn đề tuy nhiên không có thử nghiệm nào cho phép mã tùy chỉnh phản hồi với dữ liệu OPP bên ngoài. –

+0

Tôi cũng nên đề cập rằng mã mẫu được đăng không phải là giải pháp đầy đủ vì tôi thấy rằng nó vẫn hoạt động khác nhau trên các thiết bị khác nhau. Nó có thể nhận dữ liệu qua OPP trên HTC One X của tôi, nhưng hoạt động khác và không hoàn toàn thành công trên Samsung Nexus S và Galaxy Tab 2. –

Các vấn đề liên quan