2014-10-02 98 views
5

我试图不断地显示蓝牙设备并在屏幕上显示它们,但它永远不会显示我所有的设备,而是一次只显示1个。我找不到我做错了什么。这里是我的代码,可能是你可以找到它的任何问题。谢谢找不到所有的蓝牙设备android

class monitorBluetooth extends monitor { 
private ListView mLvDevices; 
private ArrayList<String> mDeviceList = new ArrayList<String>(); 

public monitorBluetooth(service service) { 

super(service); 
    bluetooth = BluetoothAdapter.getDefaultAdapter(); 

this.bReceiver = new BluetoothReceiver(); 
} 

public void finalize() throws Throwable { 

super.finalize(); 
} 

public void run() {   

    IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); 
    service.registerReceiver(this.bReceiver, filter); 

if(service != null) { 
     bluetooth = BluetoothAdapter.getDefaultAdapter(); 
     bluetooth.startDiscovery(); 
}  
} 
class BluetoothReceiver extends BroadcastReceiver { 
public void onReceive(Context context, Intent intent) { 
    Set<BluetoothDevice> pairedDevices = bluetooth.getBondedDevices(); 

    String action = intent.getAction(); 

    if(BluetoothDevice.ACTION_FOUND.equals(action)) { 
    BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
    String uuid = intent.getStringExtra(BluetoothDevice.EXTRA_UUID); 
    int rssi = intent.getShortExtra(BluetoothDevice.EXTRA_RSSI,Short.MIN_VALUE); 
    mDeviceList.add(device.getAddress() + ", " + device.getName()); // get mac address 

      ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, mDeviceList); 
      mLvDevices.setAdapter(adapter); 
    } 

    } 

} 
} 

BluetoothAdapter bluetooth; 
private BluetoothReceiver bReceiver; 

回答

1

您的代码似乎工作。我给LogCat写了你添加到mDeviceList中的东西,并得到了多个设备。

也许这是你如何显示名称或可能有不超过一个可见的BT设备?

编辑:添加的代码

public class MonitorBluetooth extends Thread{ 
BluetoothAdapter bluetooth; 
private BluetoothReceiver bReceiver; 
private Context mContext; 

public MonitorBluetooth(Context context){ 
    bluetooth=BluetoothAdapter.getDefaultAdapter(); 
    this.bReceiver=new BluetoothReceiver(); 
    this.mContext=context; 
} 

public void finalize() throws Throwable{ 
    super.finalize(); 
} 

public void run(){ 
    { 
    IntentFilter filter=new IntentFilter(BluetoothDevice.ACTION_FOUND); 
    mContext.registerReceiver(this.bReceiver,filter); 
    } 
    { 
    IntentFilter filter=new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_STARTED); 
    mContext.registerReceiver(this.bReceiver,filter); 
    } 
    { 
    IntentFilter filter=new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); 
    mContext.registerReceiver(this.bReceiver,filter); 
    } 
    bluetooth=BluetoothAdapter.getDefaultAdapter(); 
    bluetooth.startDiscovery(); 
} 

class BluetoothReceiver extends BroadcastReceiver{ 
    public void onReceive(Context context,Intent intent){ 
    String action=intent.getAction(); 
    if(BluetoothDevice.ACTION_FOUND.equals(action)){ 
    BluetoothDevice device=intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
    Log.d("BluetoothReceiver","found "+device.getAddress()+", "+device.getName()); 
    } 
    else if(BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)){ 
    Log.d("BluetoothReceiver","discovery started"); 
    } 
    else if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){ 
    Log.d("BluetoothReceiver","discovery finished"); 
    context.unregisterReceiver(this); 
    } 
    } 
} 
} 

有了这个代码,我得到的所有设备周围致电

MonitorBluetooth monitor=new MonitorBluetooth(this.getApplicationContext()); 
monitor.start(); 
从Activity.onCreate(捆绑)

+0

我用蓝牙启用附近的两个设备检查,但我可以只有一个,我已经测试了多次 – 2014-10-07 09:30:16

+0

启用!=可见,请确保它们也可见。您可以在mDeviceList.add之上添加Log.d消息来查看会发生什么。注册到BluetoothAdapter.ACTION_DISCOVERY_STARTED和BluetoothAdapter.ACTION_DISCOVERY_FINISHED也是有意义的。 – mikkokoo 2014-10-07 12:33:22

+0

当然,我让它们可见,让我试试Log.d和其他意图过滤器,你的意图 – 2014-10-07 14:24:32

1

尝试这样的一些感受订购:

public void displayDetectedDevices(){ 
    mBluetoothAdapter.startDiscovery(); 

    // Create a BroadcastReceiver for ACTION_FOUND 
    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)){ 
       BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
       String deviceName = device.getName(); 
       String deviceAddress = device.getAddress(); 
       String s = " "; 
       unpairedDevices.add(deviceName + s + deviceAddress +" \n"); 
       unpairedDevicesList = new ArrayList<String>(unpairedDevices); 
       Toast.makeText(getActivity(), unpairedDevicesList.toString(), Toast.LENGTH_LONG).show(); 
      } 
     } 
    }; 
} 

记得的onCreate()声明如下:

public void onCreate(Bundle savedInstance){ 
    super.onCreate(savedInstance); 
    unpairedDevicesList = new ArrayList<String>(); 
    unpairedDevices = new HashSet<String>(); 
} 

记住#2声明如下之前的onCreate():

ArrayList<String> unpairedDevicesList; 
Set<String> unpairedDevices; 

最后的思考:

我同时使用一个Set和一个arrayList来放置检测到的设备。一个设置将不包含重复项。取决于你想要做什么,因为它们提供了不同的功能,所定义的都是有用的。另外here是我的github页面,它包含更多的信息和完整的工作蓝牙应用程序。

随着设置的填充设备将开始填充屏幕取决于你希望你的UI的工作方式。我用了一个简单的列表。

0

我对蓝牙耳机有同样的问题。我有两个蓝牙耳机,两个都开机,但是他们没有被blueToothAdapter.startDiscovery()检测到。

后来我发现,在蓝牙耳机的情况下,您需要长按启动按钮才能激活他们的配对模式,以便通过android蓝牙发现进行检测。

下面是从developer.android.com发现附近的蓝牙设备的一个很好的例子。