【问题标题】:How to scan for available bluetooth devices in range in android?如何在android范围内扫描可用的蓝牙设备?
【发布时间】:2010-07-03 08:18:47
【问题描述】:

我需要使用 google android 2.1 获取该地区可用蓝牙设备的列表。

问题是,我不仅需要这些设备的列表,我还需要找到每个设备的唯一 ID,并且我需要一个指示器,即接收到的信号有多“好”(如 android. wifi.ScanResult)...我该怎么做?

【问题讨论】:

    标签: android bluetooth scanning


    【解决方案1】:

    查看以下代码:

    开始搜索

    mBluetoothAdapter.startDiscovery(); 
    mReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
    
        //Finding devices                 
        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 ListView
           mArrayAdapter.add(device.getName() + "\n" + device.getAddress());
        }
      }
    };
    
    IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); 
    registerReceiver(mReceiver, filter);
    

    【讨论】:

    • 漂亮干净的代码,这应该是正确的答案。
    • @SaharMillis:它对你不起作用怎么办?它工作正常,但您的其他设备需要被发现,而不仅仅是打开蓝牙。
    • 如果在该范围内找到多个蓝牙设备,这将如何工作。接收器会被多次触发吗?
    • @Zapnologica BroadcastReceiver 每台设备收到一次通知;因此,必须将它们保存在ArrayList 字段或类似字段中......而有两个?除了BluetoothDevice.ACTION_FOUND,还可以采取进一步的行动,其中一项表示扫描已完成。
    • @SaharMillis 确保您已在位置和蓝牙清单中添加权限
    【解决方案2】:

    调用方法bluetoothScanning,需要上下文

    void bluetoothScanning(){
    
        IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        context.registerReceiver(mReceiver, filter);
        final BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        mBluetoothAdapter.startDiscovery();
    
    }
    
    
    // Create a BroadcastReceiver for ACTION_FOUND.
    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                // Discovery has found a device. Get the BluetoothDevice
                // object and its info from the Intent.
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                String deviceName = device.getName();
                String deviceHardwareAddress = device.getAddress(); // MAC address
    
                Log.i("Device Name: " , "device " + deviceName);
                Log.i("deviceHardwareAddress " , "hard"  + deviceHardwareAddress);
            }
        }
    };
    

    结果

    名称:LE-Bose Revolve+ SoundLink deviceHardwareAddress: MAC .....

    【讨论】:

      【解决方案3】:

      此代码使用 BeaconManager,它不断扫描新的蓝牙设备并返回一个 Beacons List 对象,您可以使用该对象获取所需的任何信息。

      确保导入 BeaconManager

      private BeaconManager beaconManager;
      
      //In onCreate method
      beaconManager = BeaconManager.getInstanceForApplication(this);
      beaconManager.getBeaconParsers().add(new BeaconParser().
                      setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));
      
      //use these out of the onCreate method
      public void onScanStart(View view) {
              stopScanButton.setEnabled(true);
              scanningButton.setEnabled(false);
              beaconManager.bind(this);
      }
      
      @Override
      public void onBeaconServiceConnect() {
          beaconManager.removeAllRangeNotifiers();
          beaconManager.addRangeNotifier(new RangeNotifier() {
          @Override
          public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
          for (Beacon b : beacons) {
              System.out.println(String.format("%s: %f: %d", b.getBluetoothName(), b.getDistance(), b.getRssi()));
        });
          try {
      //Tells the BeaconService to start looking for beacons that match the passed.
              beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null));
          } catch (RemoteException e) {
              Toast.makeText(this, e.toString(), Toast.LENGTH_LONG).show();
          }
      }
      

      让我知道这是否适合你!

      【讨论】:

        【解决方案4】:

        能够通过蓝牙发现设备。确保你

        AndroidManifest.xml

        <uses-permission
            android:name="android.permission.BLUETOOTH"
            android:maxSdkVersion="30" />
        <uses-permission
            android:name="android.permission.BLUETOOTH_ADMIN"
            android:maxSdkVersion="30" />
        <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
        <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        

        MainActivity

        class MainActivity : AppCompatActivity() {
        
            private var bluetoothAdapter: BluetoothAdapter? = null
            private val bluetoothReceiver: BroadcastReceiver = object : BroadcastReceiver() {
                override fun onReceive(context: Context?, intent: Intent) {
                    val action = intent.action
                    Log.i("TAG", "onReceive $action")
                    if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED == action) {
                        Log.i("TAG", "Discovery finished, hide loading")
                    } else if (BluetoothDevice.ACTION_FOUND == action) {
                        val device =
                            intent.getParcelableExtra<BluetoothDevice>(BluetoothDevice.EXTRA_DEVICE)
        
                        Log.i("TAG", "Device Name: " + (device?.name ?: ""))
                        Log.i("TAG", "Device Address:" + (device?.address ?: ""))
                    }
                }
            }
        
            override fun onCreate(savedInstanceState: Bundle?) {
                ...
        
                findViewById<Button>(R.id.button_start_discovery).setOnClickListener {
                    if (bluetoothAdapter == null) {
                        initBluetoothDiscovery()
                    }
                    startDiscovery()
                }
            }
        
            private fun initBluetoothDiscovery() {
                val bluetoothManager = getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
                bluetoothAdapter = bluetoothManager.adapter
                val intentFilter = IntentFilter().apply {
                    addAction(BluetoothDevice.ACTION_FOUND)
                    addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)
                }
                registerReceiver(bluetoothReceiver, intentFilter)
            }
        
            private fun startDiscovery() {
                if (bluetoothAdapter?.isDiscovering == true) {
                    Log.i("TAG", "cancel start discovery")
                    bluetoothAdapter?.cancelDiscovery()
                }
                Log.i("TAG", "start discovery, show loading")
                bluetoothAdapter?.startDiscovery()
            }
        
            override fun onDestroy() {
                super.onDestroy()
                bluetoothAdapter?.cancelDiscovery();
                unregisterReceiver(bluetoothReceiver);
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多