web-dev-qa-db-fra.com

android bluetooth ne peut pas se connecter

Cela fait un moment que je rencontre ce problème et je n’ai pas pu le résoudre. 

J'ai une application Android qui met tous les appareils associés dans une liste. Lorsque vous cliquez sur l'un des éléments de la liste, une demande de connexion à ce périphérique Bluetooth sera initiée. 

Je peux obtenir la liste des périphériques avec leurs adresses sans problème. Le problème est qu’une fois que j’essaie de me connecter, j’obtiens une exception IOException sur socket.connect ();

Le message d'erreur est le suivant: "la lecture a échoué, la socket peut être fermée ou le délai d'attente expiré, la lecture a été relue: -1"

Voici mon code.TOUTEsuggestions seraient appréciées. Je suis plutôt coincé là-dessus.

fyi: la méthode "onEvent" est une bibliothèque qui simplifie les rappels ... cette partie fonctionne. Lorsque l'utilisateur clique sur un élément de la liste, cette méthode est appelée " public void onEvent (EventMessage.DeviceSelected) "

public class EcoDashActivity extends BaseActivity {

public static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");


private BluetoothAdapter mBluetoothAdapter;
private int REQUEST_ENABLE_BT = 100;
private ArrayList<BluetoothDevice> mDevicesList;
private BluetoothDeviceDialog mDialog;
private ProgressDialog progressBar;
private int progressBarStatus = 0;
private Handler progressBarHandler = new Handler();


@Override
public void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.main);

    mDevicesList = new ArrayList<BluetoothDevice>();

    // Register the BroadcastReceiver
    IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
    registerReceiver(mReceiver, filter);

    setupBluetooth();
}

private void setupBluetooth() {
    mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    if (mBluetoothAdapter == null) {
        // Device does not support Bluetooth
        Toast.makeText(this, "Device does not support Bluetooth", Toast.LENGTH_SHORT).show();
    }

    if (!mBluetoothAdapter.isEnabled()) {
        Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
    } else {
        searchForPairedDevices();
        mDialog = new BluetoothDeviceDialog(this, mDevicesList);
        mDialog.show(getFragmentManager(), "");
    }

}

private void searchForPairedDevices() {

    Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
    // If there are paired devices
    if (pairedDevices.size() > 0) {
        // Loop through paired devices
        for (BluetoothDevice device : pairedDevices) {
            // Add the name and address to an array adapter to show in a ListView
            mDevices.add(device.getName() + "\n" + device.getAddress());
            mDevicesList.add(device);
        }
    }
}


private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        // When discovery finds a device
        if (BluetoothDevice.ACTION_FOUND.equals(action)) {
            // Get the BluetoothDevice object from the Intent
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            // Add the name and address to an array adapter to show in a ListView
            mDevicesList.add(device);
        }
    }
};


@Override
protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(mReceiver);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_ENABLE_BT) {
        if (resultCode == RESULT_OK) {
            Toast.makeText(this, "BT turned on!", Toast.LENGTH_SHORT).show();
            searchForPairedDevices();

            mDialog = new BluetoothDeviceDialog(this, mDevicesList);
            mDialog.show(getFragmentManager(), "");
        }
    }

    super.onActivityResult(requestCode, resultCode, data);
}


public void onEvent(EventMessage.DeviceSelected event) {

    mDialog.dismiss();

    BluetoothDevice device = event.getDevice();

    ConnectThread connectThread = new ConnectThread(device);
    connectThread.start();
}


public class ConnectThread extends Thread {
    private final BluetoothSocket mmSocket;
    private final BluetoothDevice mmDevice;

    public ConnectThread(BluetoothDevice device) {
        // Use a temporary object that is later assigned to mmSocket,
        // because mmSocket is final
        BluetoothSocket tmp = null;
        mmDevice = device;

        // Get a BluetoothSocket to connect with the given BluetoothDevice
        try {
            // MY_UUID is the app's UUID string, also used by the server code
            tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
        } catch (IOException e) { }
        mmSocket = tmp;
    }

    public void run() {
        setName("ConnectThread");
        // Cancel discovery because it will slow down the connection
        mBluetoothAdapter.cancelDiscovery();

        try {
            // Connect the device through the socket. This will block
            // until it succeeds or throws an exception
            Log.d("kent", "trying to connect to device");
            mmSocket.connect();
            Log.d("kent", "Connected!");
        } catch (IOException connectException) {
            // Unable to connect; close the socket and get out
            try {
                Log.d("kent", "failed to connect");

                mmSocket.close();
            } catch (IOException closeException) { }
            return;
        }

        Log.d("kent", "Connected!");
    }

    /** Will cancel an in-progress connection, and close the socket */
    public void cancel() {
        try {
            mmSocket.close();
        } catch (IOException e) { }
    }
}

Voici mon logcat. Plutôt court.

07-22 10:37:05.129: DEBUG/kent(17512): trying to connect to device
07-22 10:37:05.129: WARN/BluetoothAdapter(17512): getBluetoothService() called with no BluetoothManagerCallback
07-22 10:37:05.129: DEBUG/BluetoothSocket(17512): connect(), SocketState: INIT, mPfd: {ParcelFileDescriptor: FileDescriptor[98]}
07-22 10:37:40.757: DEBUG/dalvikvm(17512): GC_CONCURRENT freed 6157K, 9% free 62793K/68972K, paused 7ms+7ms, total 72ms
07-22 10:38:06.975: DEBUG/kent(17512): failed to connect
07-22 10:38:06.975: DEBUG/kent(17512): read failed, socket might closed or timeout, read ret: -1

Cette dernière ligne est dans la section "Catch" d'un try/catch ... Je ne fais que consigner le message d'erreur.

Veuillez noter qu'il y a environ 20 secondes d'intervalle entre "essayer de se connecter à un périphérique" et "pas réussi à se connecter"

11
Kent Andersen

La pile bluetooth Jelly Bean est très différente des autres versions.

Cela pourrait aider: http://wiresareobsolete.com/wordpress/2010/11/Android-bluetooth-rfcomm/

Dans Gist: L'UUID est une valeur qui doit pointer vers un service publié sur votre périphérique intégré. Elle n'est pas simplement générée de manière aléatoire. La connexion RFCOMM SPP à laquelle vous souhaitez accéder a un UUID spécifique qu'il publie pour identifier ce service. Lorsque vous créez un socket, celui-ci doit correspondre au même UUID.

Si vous ciblez un périphérique 4.0.3 ou supérieur, utilisez fetchUuidsWithSdp() et getUuids() pour rechercher tous les services publiés et leurs valeurs UUID associées. Pour la compatibilité ascendante, lisez l'article

14
Vrashabh Irde

J'ai reçu le même message d'erreur après avoir connecté la prise a deuxième fois . J'ai simplement vérifié si la prise est déjà connectée.

if(!mmSocket.isConnected())
            mmSocket.connect();

Je testais sur Android 4.4.2 (Moto G).

0
marnaish