gpt4 book ai didi

Android广播接收器蓝牙事件捕获

转载 作者:IT王子 更新时间:2023-10-28 23:28:38 27 4
gpt4 key购买 nike

我正在尝试使用广播接收器捕捉蓝牙状态变化。

我的 list :

<uses-permission android:name="android.permission.BLUETOOTH" />
<application>
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<receiver android:name=".BluetoothBroadcastReceiver"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.bluetooth.adapter.action.STATE_CHANGED" />
<action android:name="android.bluetooth.adapter.action.CONNECTION_STATE_CHANGED" />
<action android:name="android.bluetooth.device.action.ACL_CONNECTED" />
<action android:name="android.bluetooth.device.action.ACL_DISCONNECTED" />
</intent-filter>
</receiver>
</application>

接收者onReceive方法:

public void onReceive(Context context, Intent intent) {

String action = intent.getAction();
Log.d("BroadcastActions", "Action "+action+"received");
int state;
BluetoothDevice bluetoothDevice;

switch(action)
{
case BluetoothAdapter.ACTION_STATE_CHANGED:
state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1);
if (state == BluetoothAdapter.STATE_OFF)
{
Toast.makeText(context, "Bluetooth is off", Toast.LENGTH_SHORT).show();
Log.d("BroadcastActions", "Bluetooth is off");
}
else if (state == BluetoothAdapter.STATE_TURNING_OFF)
{
Toast.makeText(context, "Bluetooth is turning off", Toast.LENGTH_SHORT).show();
Log.d("BroadcastActions", "Bluetooth is turning off");
}
else if(state == BluetoothAdapter.STATE_ON)
{
Log.d("BroadcastActions", "Bluetooth is on");
}
break;

case BluetoothDevice.ACTION_ACL_CONNECTED:
bluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
Toast.makeText(context, "Connected to "+bluetoothDevice.getName(),
Toast.LENGTH_SHORT).show();
Log.d("BroadcastActions", "Connected to "+bluetoothDevice.getName());
break;

case BluetoothDevice.ACTION_ACL_DISCONNECTED:
bluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
Toast.makeText(context, "Disconnected from "+bluetoothDevice.getName(),
Toast.LENGTH_SHORT).show();
break;
}
}

我启动应用程序,然后按主页按钮将其最小化。转到设置并打开蓝牙,但没有任何反应。虽然我期待 toast 和 logcat 消息。这里有什么问题?

最佳答案

为了捕捉蓝牙状态变化(STATE_OFFSTATE_TURNING_ONSTATE_ONSTATE_TURNING_OFF),请执行以下操作:

首先,在您的 AndroidManifest 文件中添加蓝牙权限:

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

在您的 Activity 或服务中创建一个广播接收器:

    private final BroadcastReceiver mBroadcastReceiver1 = new BroadcastReceiver() {

@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();

if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR);
switch(state) {
case BluetoothAdapter.STATE_OFF:
..
break;
case BluetoothAdapter.STATE_TURNING_OFF:
..
break;
case BluetoothAdapter.STATE_ON:
..
break;
case BluetoothAdapter.STATE_TURNING_ON:
..
break;
}

}
}
};

创建一个 IntentFilter 并将其注册到您的 Activity/Service 的 onCreate() 中的 BroadcastReceiver方法:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

IntentFilter filter1 = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
registerReceiver(mBroadcastReceiver1, filter1);

...
}

在您的 onDestroy() 中取消注册 BroadcastReceiver方法:

@Override
protected void onDestroy() {
super.onDestroy();

unregisterReceiver(mBroadcastReceiver1);
}

为了捕捉设备可发现性的变化(SCAN_MODE_NONESCAN_MODE_CONNECTABLESCAN_MODE_CONNECTABLE_DISCOVERABLE),如上所述,创建另一个 BroadcastReceiver 并注册/取消注册到您的 Activity。这些广播接收器之间的唯一区别是第一个使用 BluetoothAdapter.EXTRA_STATE另一个使用 BluetoothAdapter.EXTRA_SCAN_MODE .以下是 BroadcastReceiver 捕获可发现性更改的示例代码:

创建一个 IntentFilter 并将其注册到 onCreate()方法:

IntentFilter filter2 = new IntentFilter();
filter2.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
filter2.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
filter2.addAction(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED);
registerReceiver(mBroadcastReceiver2, filter2);

在 Activity/Service 中创建 BroadcastReciver 以捕获可发现性更改:

    private final BroadcastReceiver mBroadcastReceiver2 = new BroadcastReceiver() {

@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();

if(action.equals(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED)) {

int mode = intent.getIntExtra(BluetoothAdapter.EXTRA_SCAN_MODE, BluetoothAdapter.ERROR);

switch(mode){
case BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE:
..
break;
case BluetoothAdapter.SCAN_MODE_CONNECTABLE:
..
break;
case BluetoothAdapter.SCAN_MODE_NONE:
..
break;
}
}
}
};

最后在 onDestroy() 中注销 BroadcastReciver :

unregisterReceiver(mBroadcastReceiver2);

请注意,您无需添加任何 <intent-filter><receiver>到您的 AndroidManifest 文件中,当然您需要添加蓝牙权限。

如果你想捕捉( ACTION_ACL_CONNECTEDACTION_ACL_DISCONNECTEDACTION_ACL_DISCONNECT_REQUESTED ),现在你需要添加一个 <intent-filter>到您的 AndroidManifest 文件:

<intent-filter>
<action android:name="android.bluetooth.device.action.ACL_CONNECTED" />
<action android:name="android.bluetooth.device.action.ACL_DISCONNECTED" />
</intent-filter>

创建过滤器并将其注册到 onCreate()方法:

IntentFilter filter3 = new IntentFilter();
filter3.addAction(BluetoothDevice.ACTION_ACL_CONNECTED);
filter3.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED);
registerReceiver(mBroadcastReceiver3, filter3);

然后在您的 Activity/服务中创建广播接收器:

    private final BroadcastReceiver mBroadcastReceiver3 = new BroadcastReceiver() {

@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();

switch (action){
case BluetoothDevice.ACTION_ACL_CONNECTED:
..
break;
case BluetoothDevice.ACTION_ACL_DISCONNECTED:
..
break;
}
}
};

最后,取消注册:

unregisterReceiver(mBroadcastReceiver3);

如果您想了解有关状态常量的更多信息,请参阅文档:

public static final String EXTRA_STATE:

Used as an int extra field in ACTION_STATE_CHANGED intents to requestthe current power state. Possible values are: STATE_OFF,STATE_TURNING_ON, STATE_ON, STATE_TURNING_OFF

public static final String EXTRA_SCAN_MODE:

Used as an int extra field in ACTION_SCAN_MODE_CHANGED intents torequest the current scan mode. Possible values are: SCAN_MODE_NONE,SCAN_MODE_CONNECTABLE, SCAN_MODE_CONNECTABLE_DISCOVERABLE

关于Android广播接收器蓝牙事件捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30222409/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com