当前位置: 首页 > 知识库问答 >
问题:

通过蓝牙扫描未检测到蓝牙设备

安泰平
2023-03-14

我制作了一个android应用程序来扫描蓝牙设备,并向我的服务器发送一个HTTP请求,这样我就可以检测它们是开着还是关着。我已经用我的带有蓝牙适配器的台式电脑测试过了,效果很好。当检测到电脑上的蓝牙功能时,它显示电脑是打开的,当我关闭电脑上的蓝牙功能时,它是关闭的。现在,我需要使用这个应用程序的设备有:雅伯投影仪、Bose SoundLink和JBL耳机,但我遇到了一些问题。

首先,投影仪似乎无法与手机通信,我只能连接耳机或扬声器进入投影仪BT设置并扫描设备,但当我扫描手机时,什么都没有出现,比如投影仪对手机不可见,导致应用程序检测到它总是关闭。如果我用手机扫描投影仪也是一样。这怎么可能?

最后是扬声器和耳机,似乎一旦它们连接到设备(例如投影仪),它们就不再对手机可见,我认为这与节省电池/安全有关。但是有没有一种变通方法可以在连接时仍然能够检测到它们?

谢谢

编辑

这是服务中运行扫描的代码,据我所知,它使用的是蓝牙分类技术。

    private BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
private ArrayList<BluetoothDevice> arrayList = new ArrayList<>();

    @Override
public int onStartCommand(Intent intent, int flags, int startId) {

    createNotificationChannel();

    Intent intent1 = new Intent(this, MainActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(this,0,intent1,0);

    Notification notification = new NotificationCompat.Builder(this,"BTAPP")
            .setContentTitle("Bluetooth Scan")
            .setContentText("App is scanning")
            .setContentIntent(pendingIntent).build();

    startForeground(1,notification);

    IntentFilter intentFilter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
    IntentFilter intentFilter2 = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
    IntentFilter intentFilter3 = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
    registerReceiver(broadcastReceiver, intentFilter);
    registerReceiver(broadcastReceiver, intentFilter2);
    registerReceiver(broadcastReceiver, intentFilter3);
    bluetoothAdapter.startDiscovery();

    return START_STICKY;
}

final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {

    @RequiresApi(api = Build.VERSION_CODES.O)
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();

        // When discovery starts
        if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) {
            //clearing any existing list data
            flagJBL = false;
            flagBose = false;
            flagProjector = false;
            arrayList.clear();
        }

        // When discovery finds a device
        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
            if (!arrayList.contains(device)) {
                if (device.getAddress().equals(JBL_HEADSET_ADDRESS))
                    flagJBL = true;
                if (device.getAddress().equals(BOSE_SOUNDLINK_ADDRESS))
                    flagBose = true;
                if (device.getAddress().equals(PROJECTOR_ADDRESS))
                    flagProjector = true;
                arrayList.add(device);
            }
        }

        // When discovery starts
        if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
            //clearing any existing list data
            //Toast.makeText(getApplicationContext(), "Scan has stopped",Toast.LENGTH_SHORT).show();
            if (flagJBL) {
                Intent jbloni = new Intent(getApplicationContext(), RequestHandler.class);
                jbloni.putExtra("URL",JBL_ON_URL);
                startService(jbloni);
            }
            //showNotification("JBL Result", "JBL is On");
            else {
                Intent jbloffi = new Intent(getApplicationContext(), RequestHandler.class);
                jbloffi.putExtra("URL",JBL_OFF_URL);
                startService(jbloffi);
            }
            //showNotification("JBL Result", "JBL is Off");
            if (flagBose) {
                Intent boseoni = new Intent(getApplicationContext(), RequestHandler.class);
                boseoni.putExtra("URL",BOSE_ON_URL);
                startService(boseoni);
                // showNotification("Bose Result", "Bose is On");
            }
            else {
                Intent boseoffi = new Intent(getApplicationContext(), RequestHandler.class);
                boseoffi.putExtra("URL",BOSE_OFF_URL);
                startService(boseoffi);
                //showNotification("Bose Result", "Bose is Off");
            }
            if (flagProjector) {
                Intent projectoroni = new Intent(getApplicationContext(), RequestHandler.class);
                projectoroni.putExtra("URL",PROJECTOR_ON_URL);
                startService(projectoroni);
                //showNotification("Projector Result", "Projector is On");
            }
            else {
                Intent projectoroffi = new Intent(getApplicationContext(), RequestHandler.class);
                projectoroffi.putExtra("URL",PROJECTOR_OFF_URL);
                startService(projectoroffi);
                //showNotification("Projector Result", "Projector is Off");
            }

            bluetoothAdapter.startDiscovery();
        }
    }
};

共有1个答案

魏翰
2023-03-14

根据你的描述,你的Android应用程序似乎只扫描蓝牙LE设备。由于投影仪很可能使用Bluetooth classic,除名称外,这两种技术都不兼容,因此无法扫描。如果你也想检测这些设备,你需要在第二步扫描蓝牙经典设备。

就您的扬声器和耳机而言,根据我的观察,我可以说这种行为实际上是行业标准的。即使在技术上可以在连接期间继续宣传一个人的存在,从应用程序的角度来看,它只在极少数情况下才有意义,因此很少实施。

 类似资料:
  • 开启蓝牙扫描 参数说明 字段 类型 必须? 说明 blePrefix String 是 设备名称类型前缀 示例代码 Swift: RokidMobileSDK.binder.startBLEScan(blePrefix: String) ->Bool Objc: [RokidMobileSDK.binder startBLEScanWithBlePrefix:@"Rokid-"]; 手机蓝牙未打

  • 扫描设备 介绍 需要传入扫描蓝牙设备的名称的前缀,回调均在主线程。如果传空,是无法获取设备列表。 1、单前缀蓝牙设备 参数说明 字段 类型 必须? 说明 type String 是 设备名称类型前缀 举个大栗子 String type = "Rokid-" RokidMobileSDK.binder.startBTScan(type, new IBTScanCallBack() { @Ov

  • 我正在创建一个蓝牙扫描仪应用程序,并试图找到可用的设备配对。我有一个蓝牙耳机,我正试图找到运行android 10应用程序。 权限在清单中设置 应用程序包含一个简单的按钮,点击它我开始发现蓝牙设备 用于发现的回调 如果我错过了什么,有人能帮我吗?

  • 我正在尝试使用基于处理的android应用程序扫描蓝牙设备。我想使用处理通过蓝牙与我的微控制器板通信,如下例所示: http://webdelcire.com/wordpress/archives/1045 我成功地在我的android平板电脑上启动了这个应用程序。但是,我无法在平板电脑上列出蓝牙设备。我的平板电脑识别的唯一蓝牙设备是我电脑上的蓝牙适配器。为什么我不能列出所有蓝牙设备?我的电脑能够

  • 我试图用BLE API扫描附近的蓝牙设备,但它似乎不起作用 我已经在清单中添加了权限 以下内容在创建对象时 创建扫描仪回调对象并进一步扫描 在logcat中,我只看到以下内容 这是我的app build gradle } 有人能指出我在这里遗漏了什么吗?

  • 我目前正在开发一个应用程序,将使用蓝牙低能耗。 我正在使用以下链接, http://developer.android.com/samples/BluetoothLeGatt/src/com.example.android.bluetoothlegatt/DeviceScanActivity.html 我无法扫描周围的BLE设备。 要扫描设备,