2010-03-13 8 views
5

Je rencontre un problème lors de la connexion de mes appareils à Android. Si je vais dans les paramètres et les appairer je peux manuellement les amener à se connecter en utilisant le code suivant:Android Bluetooth échoue à la paire

serveur

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.connect); 

    Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); 
    startActivityForResult(discoverableIntent, REQUEST_ENABLE_BT); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    if(requestCode == REQUEST_ENABLE_BT) 
    { 
     if(resultCode == RESULT_CANCELED) 
     { 
      new AlertDialog.Builder(this) 
      .setTitle(R.string.error) 
      .setMessage(R.string.bluetooth_unavailable) 
      .setPositiveButton(android.R.string.ok, AndroidUtils.DismissListener) 
      .create() 
      .show(); 
     } 
     else 
     { 
      mServerSocket = mAdapter.listenUsingRfcommWithServiceRecord("Moo Productions Bluetooth Server", mUUID); 
      mState = State.ACCEPTING; 
      BluetoothSocket socket = mServerSocket.accept(); 
      mServerSocket.close(); 
      connected(socket); 
     } 
    } 
} 

client

Set<BluetoothDevice> pairedDevices = mAdapter.getBondedDevices(); 
BluetoothSocket socket = null; 

// Search the list of paired devices for the right one 
for(BluetoothDevice device : pairedDevices) 
{ 
    try 
    { 
     mState = State.SEARCHING; 
     socket = device.createRfcommSocketToServiceRecord(mUUID); 
     mState = State.CONNECTING; 
     socket.connect(); 
     connected(socket); 
     break; 
    } 
    catch (IOException e) 
    { 
     socket = null; 
     continue; 
    } 
} 

Mais si les appareils n'ont pas déjà été jumelés, il sort de la foreach sans connexion à une socket valide. Dans ce cas, je commence à découvrir.

// If that didn't work, discover 
if(socket == null) 
{ 
    mState = State.SEARCHING; 
    mReceiver = new SocketReceiver(); 
    mContext.registerReceiver(mReceiver, new IntentFilter(BluetoothDevice.ACTION_FOUND)); 
    mAdapter.startDiscovery(); 
} 

// ... Later ... 

private class SocketReceiver extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     if(BluetoothDevice.ACTION_FOUND.equals(intent.getAction())) 
     { 
      try 
      { 
       // Get the device and try to open a socket 
       BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
       BluetoothSocket socket = device.createRfcommSocketToServiceRecord(mUUID); 
       mState = State.CONNECTING; 
       socket.connect(); 

       // This is our boy, so stop looking 
       mAdapter.cancelDiscovery(); 
       mContext.unregisterReceiver(mReceiver); 

       connected(socket); 
      } 
      catch (IOException ioe) 
      { 
       ioe.printStackTrace(); 
      } 
     } 
    } 
} 

Mais il ne trouvera jamais l'autre périphérique. Je n'obtiens jamais une boîte de dialogue d'appairage et quand je la traverse, je vois qu'elle découvre le périphérique correct, mais elle ne parvient pas à se connecter avec cette exception java.io.IOException: Service discovery failed. Des idées sur ce qui me manque?

+0

salut CaseyB howz u? Je suis également bloquant ici dans le même problème .. signifie quand je me connecte d'un périphérique à l'autre son se connecter et encore si je fais du deuxième au premier périphérique log chat montrant le message "service découverte a échoué" alors pourquoi il ne se connecte pas autre appareil que je l'avais essayé wid plrent les pls de UUId m'aider. – shyam

+0

Je n'ai jamais été capable de comprendre cela. Je suis passé à un autre projet. Pardon. – CaseyB

Répondre

3

Votre client ne découvrira jamais le serveur si le serveur n'est pas réellement détectable. Le commentaire de votre code serveur indique "Assurez-vous que le périphérique est détectable", mais l'écoute sur un socket ne signifie pas que le périphérique est détectable. Vous pouvez faire le serveur découvrable en appelant:

Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); 
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300); 
startActivity(discoverableIntent); 

Ceci est une intention, car découvrir la preuve doit être activé par le système et seulement avec l'approbation de l'utilisateur (si cela soulèvera une boîte de dialogue demandant la possibilité de découvrir pendant 300 secondes). Ce n'est que pendant cette fenêtre de 300 secondes que le serveur sera réellement détectable. Pendant ce temps, votre code client devrait fonctionner correctement et vous obtiendrez les demandes d'appariement.

Ceci est traité en détail dans le guide dev Android: http://developer.android.com/guide/topics/wireless/bluetooth.html

+0

J'utilise ce code, je viens de mettre le commentaire là pour la brièveté. J'essayais de réduire l'extrait de code. – CaseyB

+0

Je vais mettre à jour mon code pour être plus complet. – CaseyB

0

Je ne sais pas si elle est toujours pertinente, mais je l'ai fait comme ça et ça a marché:

if (BluetoothDevice.ACTION_FOUND.equals(action)) { 
    discoveredDeviceName = intent.getStringExtra(BluetoothDevice.EXTRA_NAME); 
} 

if (discoveredDeviceName.equals("your_device_name")) { 
    mDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
} 

En outre, Je voudrais essayer d'annuler la découverte avant:

BluetoothSocket socket = device.createRfcommSocketToServiceRecord(mUUID); 
socket.connect();