3

OBEX オブジェクト プッシュ プロファイルをサポートするデバイスがあります。このプロファイルは、シリアル ポート プロファイルに基づいています。私の推測では、Android Bluetooth チャットの例を使用して、このデバイスを Android Phone に接続できると思います。socket.accept()しかし、Android SDKの機能に関して問題が発生しました。私は次のように自分の電話をこのデバイスに接続することを達成しようとしています:

adapter = BluetoothAdapter.getDefaultAdapter(); 
device = adapter.getRemoteDevice("00:1B:DC:0F:EC:7E");

AcceptThread = new AcceptThread(true, adapter, device);
AcceptThread.start(); 

AcceptThread のコンストラクターは次のようにコーディングされます。

public AcceptThread(boolean secure, BluetoothAdapter adapter, BluetoothDevice device) {
    BluetoothServerSocket tmp = null;
    this.adapter = adapter;
    this.device = device;

    // Create a new listening server socket
    try {
        tmp = adapter.listenUsingInsecureRfcommWithServiceRecord(device.getName(), UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
    } catch (Exception e) {
        Log.e(TAG, ".AcceptThread # listen() failed", e);
    } 
    mmServerSocket = tmp;
}

問題は、connect()前に言ったようにしようとするときです

public void run() {
    BluetoothSocket socket = null;

    // Listen to the server socket if we're not connected
    while (mState != STATE_CONNECTED) {
        try {
            // This is a blocking call and will only return on a
            // successful connection or an exception
            Log.d(TAG, "AcceptThread.run: accepting server socket connection");

            socket = mmServerSocket.accept(20000); 

            Log.d(TAG, ".AcceptThread.run # server socket connection accepted");
        } catch (Exception e) {
            Log.e(TAG, ".run # accept() failed: "+e);
            break;
        }
    }
}

ご覧のとおり、ServerSocket はすべての着信接続を受け入れる20 seconds20000 ms.、時間切れになると、アプリは次のような IOException をスローします。

07-11 10:30:08.355: E/SIMPLECONNECT(1301): .run # accept() failed: java.io.IOException: Connection timed out

これは、私のデバイスが Android フォンに接続できなかったことを示しています。このデバイスには、ディスプレイに接続ボタンがなく、ファイルを電話に送信する送信機能だけがあります。この送信機能もバックグラウンドで接続を行うと思いますが、よくわかりません。

誰かが私のために解決策を特定できますか? でアプリを実行していSamsung Galaxy SIIIますAndroid 4.0.4

4

1 に答える 1

9

私は最終的にそれを解決しました.問題は、異なるAndroidバージョンと異なるデバイスが異なるソケットを必要とするように見えることです. Samsung Galaxy XCOVER、Tab1、Tab2、Nexus、Note、Motorola Defy、HTC Flyer で試してみました。私が使用したソケットは次のとおりです。

A:

Method m = mmDevice.getClass().getMethod("createRfcommSocket", new Class[] { int.class });
mSocket = (BluetoothSocket) m.invoke(mmDevice, Integer.valueOf(1));

B:

Method m = mmDevice.getClass().getMethod("createInsecureRfcommSocket", new Class[]{int.class});
mSocket=(BluetoothSocket)m.invoke(mmDevice,Integer.valueOf(1));

子:

mSocket=BluetoothAdapter.getDefaultAdapter().getRemoteDevice(mmDevice.getAddress()).createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));

Android 4.0.x は Nexus、Flyer、Tab1 with A,B で動作 Android 4.0.3 は Tab2 with B で動作 Android 3,6,x は DEFY with A,B で動作 Android 2.3.6 は XCOVER with C で動作

すべてのデバイスで魔女が機能するソリューションを見つけることができず、ソケットを作成して使用する前に魔女ソケットが機能することを見つけることができません。特に、XCOVER は例外をスローせずにすべてのソケットに対して connect() を実行しますが、 tro write() を試すとキャッチします。したがって、すべてのデバイスで機能するbloothoh接続をセットアップする場合は、ソケットを作成し、書き込みを接続してから、機能するソケットを覚えておく必要があります(たとえば、設定で)

于 2012-08-09T06:53:10.403 に答える