5

OBEX Object Push Profile(OPP)を使用してBluetooth経由でデータを送信するデバイスがあります。

adb logcatを使用すると、Androidデバイスが接続を受信して​​いることがわかります(ただし、この接続を中止しますか?)

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

Bluetoothファイル転送(市場からの無料アプリケーション)をインストールすると、ファイルを受信できます。しかし、他のアプリケーションをインストールしたくありません。

4

1 に答える 1

2

私は(少なくとも部分的に)解決策を持っていると信じています。これにより、OPPを介してファイルを傍受し、カスタムコードを追加できるようになります。最初のステップは、[設定]>[アプリ]>[実行中]>[Bluetooth共有]に移動して、BluetoothOppService

次に、リフレクションを使用しBluetoothAdapterて、特定のポートでリッスンできるメソッド(以下のコード)にアクセスしました。その後、着信OPP通信を傍受し、入力ストリームと出力ストリームと対話できます。このSOスレッドは、OPP通信部分に役立ちますが、最初のステップとして、データストリームを読み取り、OPP'OK'メッセージで応答しました。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);
        }
    }
}

使用法:使用して初期化する

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

その後、別のThread(ブロッキングを防ぐために)から以下を使用すると、リモートデバイスは経由で接続できますsocket = serverSocket.accept();

于 2013-01-03T08:15:01.990 に答える