无法找到所有蓝牙设备的 Android

5

我正在尝试连续显示蓝牙设备并在屏幕上显示它们,但它从未向我展示所有设备,而只是一次显示一个设备。我找不到我做错了什么。下面是我的代码,也许你可以找到任何问题。谢谢

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;
3个回答

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

记得在onCreate()之前声明以下内容:

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

最后的想法:

我使用了SetarrayList来放置检测到的设备。Set不会包含重复项。根据您想要做什么,定义两者都有帮助,因为它们提供不同的功能。此外,这里是我的Github页面,其中包含更多信息和完整的蓝牙应用程序。

随着集合的填充,设备将开始在屏幕上显示,具体取决于您想要UI如何工作。我使用了一个简单的列表。


1
你的代码似乎可以工作。我将你添加到mDeviceList的内容写入LogCat中,并获得了多个设备。
也许是因为你显示名称的方式或者周围没有多于一个可见的蓝牙设备?
编辑:添加了代码
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(Bundle)方法中


我已经检查了附近两个启用蓝牙的设备,但只能连接一个。我已经测试了很多次。 - JNI_OnLoad
enabled!= visible,确保它们也是可见的。您可以在mDeviceList.add顶部添加Log.d消息,以查看发生了什么。还有可能注册BluetoothAdapter.ACTION_DISCOVERY_STARTED和BluetoothAdapter.ACTION_DISCOVERY_FINISHED。 - ovikoomikko
我确保它们可见,让我尝试使用Log.d和您提出的其他意图过滤器。 - JNI_OnLoad
我直接调用了run,可能是并发问题。 - ovikoomikko

0

我遇到了蓝牙耳机的同样问题。我有两个蓝牙耳机,它们都已开启,但它们并未被blueToothAdapter.startDiscovery()检测到。

后来我发现,在蓝牙耳机的情况下,您需要长按启动按钮以激活它们的配对模式,以便被安卓蓝牙搜索检测到。

以下是在developer.android.com中发现附近蓝牙设备的不错示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接