如何使用广播接收器检测蓝牙状态变化?

Posted

技术标签:

【中文标题】如何使用广播接收器检测蓝牙状态变化?【英文标题】:How to detect Bluetooth state change using a broadcast receiver? 【发布时间】:2014-09-13 07:28:45 【问题描述】:

我正在尝试制作一个在设备的蓝牙打开时显示敬酒的应用。即使我的应用程序没有运行,我也想这样做。所以我应该使用一个广播接收器,添加一些权限,一个意图过滤器到 android manifest 并创建一个 java 类,但我不知道细节。

我该怎么办?我应该使用哪些权限?

【问题讨论】:

【参考方案1】:

就权限而言,要检测蓝牙的状态变化,您需要将其添加到您的 AndroidManifest.xml。

<uses-permission android:name="android.permission.BLUETOOTH" />

示例接收器如下所示,您可以将此代码添加到要处理广播的位置,例如活动:

    private final BroadcastReceiver mReceiver = new BroadcastReceiver() 
            public void onReceive (Context context, Intent intent) 
                String action = intent.getAction();

                if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) 
                    if(intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1) 
    == BluetoothAdapter.STATE_OFF)
    // Bluetooth is disconnected, do handling here




        ;

要使用接收器,您需要注册它。您可以执行以下操作。我在我的主要活动中注册了接收器。

registerReceiver(this, new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED));

您也可以决定将其全部添加到您的 AndroidManifest.xml 中。这样,您可以为接收器创建一个特殊的类并在那里处理它。无需注册receiver,只需创建类并将以下代码添加到AndroidManifest

<receiver
        android:name=".packagename.NameOfBroadcastReceiverClass"
        android:enabled="true">
    <intent-filter>
        <action android:name="android.bluetooth.adapter.action.STATE_CHANGED"/>
    </intent-filter>
</receiver>

【讨论】:

我只知道做一类广播接收器 如果我关闭应用程序,这个接收器应该工作吗?因为它不起作用。【参考方案2】:

您必须获得以下许可。

<uses-permission android:name="android.permission.BLUETOOTH" />

你必须把它写成你的意图过滤器在接收者标签中。

<action android:name="android.bluetooth.adapter.action.STATE_CHANGED" />

【讨论】:

【参考方案3】:

很遗憾,对于面向 api 26 或更高版本的应用,清单声明的广播接收器不再工作(参考此处:https://developer.android.com/guide/components/broadcast-exceptions),但有一些例外。 android.bluetooth.adapter.action.STATE_CHANGED 不在该列表中。

对于蓝牙,您只能在以下位置监听变化:

ACTION_CONNECTION_STATE_CHANGEDACTION_ACL_CONNECTEDACTION_ACL_DISCONNECTED

【讨论】:

你列出的动作连接状态改变了两次 那么解决方法是什么?一旦我向 ACTION_CONNECTION_STATE_CHANGED 注册,意图应该在 onReceive 中返回给我什么。或者是否有另一种技术来执行任务 您仍然可以在活动或片段级别注册广播接收器,请记住在完成工作后取消注册接收器 谢谢。由于 API 26 中的这些更改,我无法检测到从“蓝牙开启”到“蓝牙关闭”的变化。当我在 MainApplikation.kt 中注册接收器时,它就像一个魅力: registerBlootoothReceiver() val filter = IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED ) bluetoothReceiver = BluetoothReceiver() registerReceiver(bluetoothReceiver, filter)

以上是关于如何使用广播接收器检测蓝牙状态变化?的主要内容,如果未能解决你的问题,请参考以下文章

在android的广播接收器中检测日变化事件

连接蓝牙设备时启动应用程序

应用程序关闭时,带有广播接收器的工作管理器不起作用

如何检测服务和广播接收器中的关键事件

为啥当主应用停止时我的小部件广播接收器服务停止

android/或替代蓝牙耳机的粘性广播意图