【问题标题】:can not find all bluetooth devices android找不到所有蓝牙设备android
【发布时间】:2014-10-02 09:42:24
【问题描述】:

我正在尝试连续显示蓝牙设备并在屏幕上显示它们,但它从不显示所有设备,而是一次只显示 1 个。我找不到我做错了什么。这是我的代码,您可能会在其中找到任何问题。谢谢

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;

【问题讨论】:

    标签: android android-intent bluetooth broadcastreceiver


    【解决方案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;
    

    最后的想法:

    我同时使用了SetarrayList 来放置检测到的设备。Set 将不包含重复项。根据您想要做的事情,定义两者是有帮助的,因为它们提供不同的功能。 here 也是我的 github 页面,它包含更多信息和完整的蓝牙应用程序。

    随着集合的填充,设备将开始填充屏幕,具体取决于您希望 UI 的工作方式。我使用了一个简单的列表。

    【讨论】:

      【解决方案2】:

      您的代码似乎有效。我给 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(Bundle)

      【讨论】:

      • 我检查了我附近的两台启用蓝牙的设备,但我只能是一台,我已经测试了很多次
      • 已启用!=可见,确保它们也可见。您可以在 mDeviceList.add 顶部添加一条 Log.d 消息以查看会发生什么。注册到 BluetoothAdapter.ACTION_DISCOVERY_STARTED 和 BluetoothAdapter.ACTION_DISCOVERY_FINISHED 也可能有意义。
      • 确定我让它们可见,让我尝试使用 Log.d 和其他您打算使用的意图过滤器
      • 我直接调用了run,可能是并发问题。
      【解决方案3】:

      我在使用蓝牙耳机时遇到了同样的问题。我有两个蓝牙耳机,都开机了,但是blueToothAdapter.startDiscovery()没有检测到。

      后来我发现,如果是蓝牙耳机,你需要长按开始按钮来激活它们的配对模式,才能被安卓蓝牙发现检测到。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-15
        • 1970-01-01
        • 2018-05-21
        • 1970-01-01
        • 1970-01-01
        • 2013-10-13
        • 2016-01-07
        相关资源
        最近更新 更多