0

Android BluetoothChatの変更を使用して、デバイスに1つずつ接続します。

  1. デバイスに接続してみてください
  2. 接続に失敗した場合は、別のデバイスに接続してください
  3. 接続されている場合は、デバイスからデータを読み取ってから、別のデバイスなどに接続してみてください。

しかし、例外が発生します。サービス検出がSamsung Galaxy i-9000(Android 2.3)のmmSocket.connect()行で失敗しました。

問題は、HTC Desire(Android 2.2)でアプリケーションを使用している場合、正常に動作することです。

しかし、ソケット接続の前にThread.sleep(...)を追加すると、SamsungとHTCでは常にソケット接続が正常に行われます。

Androidバージョンまたはコードに問題がありますか?

コードは次のとおりです。

private class ConnectThread extends Thread {
private final BluetoothSocket mmSocket;
    private final BluetoothDevice mmDevice;
    private boolean mIsCanceled = false;

    public ConnectThread(BluetoothDevice device) {
        mmDevice = device;
        BluetoothSocket tmp = null;

        if(LOG_ENABLED) Log.d(TAG, "create mConnectThread " + mmDevice.getAddress());

        // Get a BluetoothSocket for a connection with the
        // given BluetoothDevice

        try
        {
            tmp = device.createRfcommSocketToServiceRecord(SerialPortServiceClass_UUID);
            if(LOG_ENABLED) Log.d(TAG, "create socket");
        }
        catch (IOException e) {
            if(LOG_ENABLED) Log.e(TAG, "create() failed", e);
        }

        mmSocket = tmp;
    }

    public void run() {
        if(LOG_ENABLED) Log.d(TAG, "run mConnectThread " + mmDevice.getAddress());

        // Always cancel discovery because it will slow down a connection
        mAdapter.cancelDiscovery();

        /*
        With this code commented "mmSocket.connect()" throws an exception
        Service discovery failed on Samsung Galaxy S
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }*/

        if(mIsCanceled) return;

        // Make a connection to the BluetoothSocket
        try {
            // This is a blocking call and will only return on a
            // successful connection or an exception
            if(LOG_ENABLED) Log.d(TAG, "socket.connect() " + mmDevice.getAddress());
            mmSocket.connect();
        } catch (Exception e) {

            if(LOG_ENABLED) Log.e(TAG, e.getMessage() + " " + mmDevice.getAddress(), e);

            try {
                mmSocket.close();
                if(LOG_ENABLED) Log.d(TAG, "mConnectThread mmSocket.close() " + mmDevice.getAddress());
            } catch (IOException e1) {

                if(LOG_ENABLED) Log.e(TAG, "mConnectThread mmSocket.close() error" + mmDevice.getAddress());
                if(LOG_ENABLED) Log.e(TAG, e1.getMessage() + " " + mmDevice.getAddress(), e1);
            }

            connectionFailed(mmDevice.getAddress());

            return;
        }

        // Reset the ConnectThread because we're done
        synchronized (CBluetoothAdapter.this) {
            mConnectThread = null;
        }

        // Start the connected thread
        connected(mmSocket, mmDevice);
    }

    public void cancel() {
        try {
            mmSocket.close();
            if(LOG_ENABLED) Log.d(TAG, "mConnectThread socket close() " + mmDevice.getAddress());
        } catch (IOException e) {
            if(LOG_ENABLED) Log.e(TAG, "mConnectThread close() of connect socket failed " + mmDevice.getAddress(), e);
        }

        mIsCanceled = true;
    }
}

そしてこれはLogCatからのものです:

10-04 12:54:57.035: D/CBluetoothAdapter(27291): Start connect 00:0A:84:02:77:6F
10-04 12:54:57.039: D/CBluetoothAdapter(27291): Connecting to device 00:0A:84:02:77:6F
10-04 12:54:57.039: D/CBluetoothAdapter(27291): connect to: 00:0A:84:02:77:6F
10-04 12:54:57.039: D/CBluetoothAdapter(27291): create mConnectThread 00:0A:84:02:77:6F
10-04 12:54:57.187: D/CBluetoothAdapter(27291): create socket
10-04 12:54:57.187: D/CBluetoothAdapter(27291): State changed: CONNECTING
10-04 12:54:57.191: D/CBluetoothAdapter(27291): run mConnectThread 00:0A:84:02:77:6F
10-04 12:54:57.203: D/CBluetoothAdapter(27291): socket.connect() 00:0A:84:02:77:6F
10-04 12:55:03.234: E/CBluetoothAdapter(27291): Service discovery failed 00:0A:84:02:77:6F
10-04 12:55:03.234: E/CBluetoothAdapter(27291): java.io.IOException: Service discovery failed
10-04 12:55:03.234: E/CBluetoothAdapter(27291):     at     android.bluetooth.BluetoothSocket$SdpHelper.doSdp(BluetoothSocket.java:406)
10-04 12:55:03.234: E/CBluetoothAdapter(27291):     at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:217)
10-04 12:55:03.234: E/CBluetoothAdapter(27291):     at     scatemobile.adapters.CBluetoothAdapter$ConnectThread.run(CBluetoothAdapter.java:473)
10-04 12:55:03.253: D/CBluetoothAdapter(27291): mConnectThread mmSocket.close() 00:0A:84:02:77:6F
10-04 12:55:03.253: D/CBluetoothAdapter(27291): Connection failed 00:0A:84:02:77:6F
10-04 12:55:03.253: D/CBluetoothAdapter(27291): Disconnect 00:0A:84:02:77:6F
10-04 12:55:03.253: D/CBluetoothAdapter(27291): mConnectThread socket close() 00:0A:84:02:77:6F
10-04 12:55:03.253: D/CBluetoothAdapter(27291): State changed: DISABLED
10-04 12:55:03.253: D/CBluetoothAdapter(27291): Start connect 00:1D:28:92:A2:D1
10-04 12:55:03.257: D/CBluetoothAdapter(27291): Connecting to device 00:1D:28:92:A2:D1
10-04 12:55:03.257: D/CBluetoothAdapter(27291): connect to: 00:1D:28:92:A2:D1
10-04 12:55:03.257: D/CBluetoothAdapter(27291): create mConnectThread 00:1D:28:92:A2:D1
10-04 12:55:03.257: D/CBluetoothAdapter(27291): create socket
10-04 12:55:03.261: D/CBluetoothAdapter(27291): Send msg MSG_CONNECTION_FAILED 00:0A:84:02:77:6F     1079579976
10-04 12:55:03.273: D/CBluetoothAdapter(27291): State changed: CONNECTING
10-04 12:55:03.273: D/CBluetoothAdapter(27291): run mConnectThread 00:1D:28:92:A2:D1
10-04 12:55:03.289: D/CBluetoothAdapter(27291): socket.connect() 00:1D:28:92:A2:D1
10-04 12:55:09.304: E/CBluetoothAdapter(27291): Service discovery failed 00:1D:28:92:A2:D1
10-04 12:55:09.304: E/CBluetoothAdapter(27291): java.io.IOException: Service discovery failed
10-04 12:55:09.304: E/CBluetoothAdapter(27291):     at     android.bluetooth.BluetoothSocket$SdpHelper.doSdp(BluetoothSocket.java:406)
10-04 12:55:09.304: E/CBluetoothAdapter(27291):     at     android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:217)
10-04 12:55:09.304: E/CBluetoothAdapter(27291):     at scatemobile.adapters.CBluetoothAdapter$ConnectThread.run(CBluetoothAdapter.java:473)
10-04 12:55:09.312: D/CBluetoothAdapter(27291): mConnectThread mmSocket.close() 00:1D:28:92:A2:D1
10-04 12:55:09.312: D/CBluetoothAdapter(27291): Connection failed 00:1D:28:92:A2:D1
10-04 12:55:09.316: D/CBluetoothAdapter(27291): Disconnect 00:1D:28:92:A2:D1
10-04 12:55:09.316: D/CBluetoothAdapter(27291): mConnectThread socket close() 00:1D:28:92:A2:D1
10-04 12:55:09.316: D/CBluetoothAdapter(27291): State changed: DISABLED
10-04 12:55:09.316: D/CBluetoothAdapter(27291): Send msg MSG_CONNECTION_FAILED 00:1D:28:92:A2:D1     1079579976
10-04 12:55:09.320: D/CBluetoothAdapter(27291): Start connect 00:0A:84:02:77:70
10-04 12:55:09.324: D/CBluetoothAdapter(27291): Connecting to device 00:0A:84:02:77:70
10-04 12:55:09.324: D/CBluetoothAdapter(27291): connect to: 00:0A:84:02:77:70
10-04 12:55:09.324: D/CBluetoothAdapter(27291): create mConnectThread 00:0A:84:02:77:70
10-04 12:55:09.328: D/CBluetoothAdapter(27291): create socket
10-04 12:55:09.335: D/CBluetoothAdapter(27291): State changed: CONNECTING
10-04 12:55:09.339: D/CBluetoothAdapter(27291): run mConnectThread 00:0A:84:02:77:70
10-04 12:55:09.343: D/CBluetoothAdapter(27291): socket.connect() 00:0A:84:02:77:70
10-04 12:55:15.359: E/CBluetoothAdapter(27291): Service discovery failed 00:0A:84:02:77:70
10-04 12:55:15.359: E/CBluetoothAdapter(27291): java.io.IOException: Service discovery failed
10-04 12:55:15.359: E/CBluetoothAdapter(27291):     at     android.bluetooth.BluetoothSocket$SdpHelper.doSdp(BluetoothSocket.java:406)
10-04 12:55:15.359: E/CBluetoothAdapter(27291):     at     android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:217)
10-04 12:55:15.359: E/CBluetoothAdapter(27291):     at     scatemobile.adapters.CBluetoothAdapter$ConnectThread.run(CBluetoothAdapter.java:473)
10-04 12:55:15.367: D/CBluetoothAdapter(27291): mConnectThread mmSocket.close() 00:0A:84:02:77:70
10-04 12:55:15.367: D/CBluetoothAdapter(27291): Connection failed 00:0A:84:02:77:70
10-04 12:55:15.367: D/CBluetoothAdapter(27291): Disconnect 00:0A:84:02:77:70
10-04 12:55:15.367: D/CBluetoothAdapter(27291): mConnectThread socket close() 00:0A:84:02:77:70
10-04 12:55:15.367: D/CBluetoothAdapter(27291): State changed: DISABLED
10-04 12:55:15.375: D/CBluetoothAdapter(27291): Start connect 00:0A:84:02:5F:3A
10-04 12:55:15.375: D/CBluetoothAdapter(27291): Send msg MSG_CONNECTION_FAILED 00:0A:84:02:77:70 1079579976
4

1 に答える 1

2

コードを変更しました。ここで、BluetoothSocketの作成にリフレクションを使用します。

Method m;

m = device.getClass().getMethod("createRfcommSocket", new Class[]{int.class});
tmp = (BluetoothSocket)m.invoke(device, 1);

そしてそれは私のために働きます!問題が解決しました。

于 2012-10-04T10:51:50.267 に答える