Receive file by Bluetooth via OBEX Object PushProfile

后端 未结 1 1396
伪装坚强ぢ
伪装坚强ぢ 2021-01-03 02:11

I have device which sends data via Bluetooth using OBEX Object Push Profile (OPP).

Using adb logcat i see that my android device receives a connection (but abort thi

相关标签:
1条回答
  • 2021-01-03 02:23

    I believe I have (at least a partial) solution which should then allow files to be intercepted via OPP and custom code added. The first step is to go to settings > apps > running > Bluetooth Share and kill the BluetoothOppService

    Then I used reflection to access a method on BluetoothAdapter (code below) which allows listening on a specific port. After which we can intercept the incoming OPP communication and interact with the input and output streams. This SO thread will help with the OPP communication part, but as an initial step I read the data stream and reponded with an OPP 'OK' message ie 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);
            }
        }
    }
    

    Usage: initialise using

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

    After which, use the following from a separate Thread (to prevent blocking) and remote devices can connect via socket = serverSocket.accept();

    0 讨论(0)
提交回复
热议问题