2010-03-13 23 views
5

Tengo un problema para hacer que mis dispositivos se sincronicen en Android. Si entro en la configuración, y reunirlos manualmente puedo conseguir que se conectan con el siguiente código:Bluetooth de Android no se puede emparejar

servidor

@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); 
     } 
    } 
} 

cliente

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; 
    } 
} 

Pero si los dispositivos aún no se han emparejado, se sale del foreach sin conectarse a un socket válido En ese caso, empiezo a descubrir.

// 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(); 
      } 
     } 
    } 
} 

Pero nunca encontrará el otro dispositivo. Nunca aparece un cuadro de diálogo de emparejamiento y cuando lo veo veo que descubre el dispositivo correcto, pero no se puede conectar con esta excepción java.io.IOException: Service discovery failed. ¿Alguna idea de lo que me estoy perdiendo?

+0

Hola CaseyB howz u? También me estoy metiendo aquí en el mismo problema ... significa que cuando me conecto de un dispositivo a otro me conecto y de nuevo si lo hago desde el segundo hasta el primer registro del dispositivo mostrando el mensaje "error en el descubrimiento del servicio", entonces ¿por qué no se está conectando? otro dispositivo lo había probado con otros tipos. Los pls de UUId me ayudaron. – shyam

+0

Nunca pude resolver esto. Pasé a otro proyecto. Lo siento. – CaseyB

Respuesta

3

Su cliente nunca descubrirá el servidor si el servidor no es realmente detectable. El comentario del código del servidor dice "Asegúrese de que el dispositivo sea visible", pero escuchar en un socket no significa que el dispositivo sea detectable. Puede hacer que el servidor detectable llamando:

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

Este es un intento porque la visibilidad debe ser habilitada por el sistema y sólo con la aprobación por parte del usuario (por lo que esto elevará un cuadro de diálogo, solicitando detectabilidad durante 300 segundos). Solo durante esta ventana de 300 segundos, el servidor será realmente detectable. Durante este tiempo, su código de cliente debería funcionar bien y obtendrá las solicitudes de sincronización.

Todo esto se trata en detalle en la guía dev Android: http://developer.android.com/guide/topics/wireless/bluetooth.html

+0

Utilizo ese código, simplemente pongo el comentario allí por brevedad. Intentaba hacer el fragmento de código más pequeño. – CaseyB

+0

Actualizaré mi código para que sea más completo. – CaseyB

0

No sabe si sigue siendo relevante, pero lo hice así y funcionó:

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

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

Además, Intentaré cancelar el descubrimiento antes de:

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