12

Objetivo: Cree una aplicación de Android que descubra los nombres y las direcciones de los dispositivos BT dentro del alcance y envíe sus valores a un servicio web. Los dispositivos BT no han sido enlazados previamente al dispositivo host, solo quiero sondear todo mientras camino.Detección de dispositivo Bluetooth en Android - startDiscovery()

lo que he hecho:

  1. con poros más documentación.
  2. Implementé una instancia local del adaptador de BT del dispositivo host.
  3. Implementé una notificación para habilitar BT si no está habilitado.
  4. Receptores y extensiones de difusión registrados para analizar el ACTION_FOUNDs que procede de startDiscovery().
  5. Registrado BLUETOOTH y BLUETOOTH_ADMIN permisos en el manifiesto.

Las cosas funcionan (como se ha probado con el registro incremental de la consola) hasta startDiscovery().


frustración:

  • startDiscovery() - sospecho que estoy pasando esto en el contexto equivocado. ¿En qué contexto necesita ubicarse este método para funcionar correctamente?

Si ha podido hacer funcionar este método, le agradecería mucho su sabiduría.

ACTUALIZACIÓN - aquí hay una versión simplificada del código que me está causando dolor; esta simplificación recapitula mi error. Este código se ejecuta, no arroja errores cat.log u otros errores, simplemente no da ningún resultado.

package aqu.bttest; 

import android.app.Activity; 
import android.bluetooth.BluetoothAdapter; 
import android.bluetooth.BluetoothDevice; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.Bundle; 
import android.widget.Toast; 

public class BT2Activity extends Activity { 

private BluetoothAdapter mBTA; 
private SingBroadcastReceiver mReceiver; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    //register local BT adapter 
    mBTA = BluetoothAdapter.getDefaultAdapter(); 
    //check to see if there is BT on the Android device at all 
    if (mBTA == null){ 
     int duration = Toast.LENGTH_SHORT; 
     Toast.makeText(this, "No Bluetooth on this handset", duration).show(); 
    } 
    //let's make the user enable BT if it isn't already 
    if (!mBTA.isEnabled()){ 
     Intent enableBT = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
     startActivityForResult(enableBT, 0xDEADBEEF); 
    } 
    //cancel any prior BT device discovery 
    if (mBTA.isDiscovering()){ 
     mBTA.cancelDiscovery(); 
    } 
    //re-start discovery 
    mBTA.startDiscovery(); 

    //let's make a broadcast receiver to register our things 
    mReceiver = new SingBroadcastReceiver(); 
    IntentFilter ifilter = new IntentFilter(BluetoothDevice.ACTION_FOUND); 
    this.registerReceiver(mReceiver, ifilter); 
} 

private class SingBroadcastReceiver extends BroadcastReceiver { 

    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); //may need to chain this to a recognizing function 
     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 Toast 
      String derp = device.getName() + " - " + device.getAddress(); 
      Toast.makeText(context, derp, Toast.LENGTH_LONG); 
     } 
    } 
} 

}

+0

Ayudaría saber el error que está recibiendo ... o al menos qué le está haciendo creer exactamente que 'startDiscovery()' funciona incorrectamente. –

Respuesta

15

qué contexto necesita ser colocado dentro de funcionar adecuadamente este método.

En pocas palabras, se debe utilizar cuando se quiere startDiscovery() su aplicación para detectar dispositivos Bluetooth locales ... por ejemplo, si desea implementar un ListActivity que escanea y añade dinámicamente los dispositivos Bluetooth cercanos a un ListView (ver DeviceListActivity).

Su uso del método startDiscovery() debería ser algo como esto:

  1. definir una variable de clase que representa el adaptador Bluetooth local.

    BluetoothAdapter mBtAdapter = BluetoothAdapter.getDefaultAdapter(); 
    
  2. Verifique si su dispositivo ya está "descubriendo". Si es así, cancela el descubrimiento.

    if (mBtAdapter.isDiscovering()) { 
        mBtAdapter.cancelDiscovery(); 
    } 
    
  3. Inmediatamente después de comprobar (y posiblemente la cancelación) descubrimiento modo, iniciar el descubrimiento llamando,

    mBtAdapter.startDiscovery(); 
    
  4. Tenga mucho cuidado en general acerca de dejar accidentalmente el dispositivo en modo de descubrimiento. Realizar descubrimiento de dispositivo es un procedimiento pesado para el adaptador Bluetooth y consumirá muchos de sus recursos. Por ejemplo, desea asegurarse de marcar/cancelar el descubrimiento antes de intentar establecer una conexión. Lo más probable es que también desee cancelar el descubrimiento en su método onDestroy.

Vamos a saber si esto ayudó ... y si todavía tiene problemas, actualice su respuesta con la salida Logcat y/o cualquier mensaje de error que está recibiendo, y tal vez pueda ayudar a salir un poco Más.

+0

Eso ayudó. Además, pasar resultados a un ArrayAdapter en lugar de un Toast definitivamente también ayudó. – Lemminkainen

+0

hay alguna manera de seguir escaneando continuamente en el servicio BG sin poner Timer ... cualquier API de nivel de sistema. – CoDe

+0

@Shubh No lo creo. La razón por la cual se implementa esta restricción es para asegurar que las aplicaciones no abusen de 'Bluetooth' escaneando continuamente en segundo plano. –

Cuestiones relacionadas