java - 处理 Android 蓝牙 LE 断开通知

标签 java android eclipse bluetooth

我已经完成了一个连接到蓝牙 LE(低功耗,4.0)计步器的 Android 应用程序的开发。一切都很好,除了我根本没有处理断开连接的情况,而且我想确保我能处理。

我想确保,如果用户关闭智能手机蓝牙或关闭蓝牙计步器设备的电源,我可以立即收到通知。我已经弄清楚如何做到这一点,代码如下。但是,当我检测到蓝牙断开连接时,我不确定如何从接收器类与我的 Activity (用户可能正在进行的任何 Activity )进行对话。在这种情况下,我设想当前 Activity 中会出现一条消息,告诉用户必须再次打开蓝牙才能继续。

所以,我想我的问题是如何从 Receiver 类通知我的任何一项 Activity (取决于用户所在的 Activity )?

谢谢!

AndroidManifest.xml

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

 <receiver android:name="com.pedometerproject" android:exported="false">
 <intent-filter>
   <action android:name"android.bluetooth.adapter.action.STATE_CHANGED"/>
 </intent-filter>

蓝牙测试.java

 public class BluetoothTest extends BroadcastReceiver {

  @override
  public void onReceive(Context context, Intent intent)
  {

       if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(intent.getAction()))
       {
           if (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,-1) == BluetoothAdapter.STATE_OFF)
           {
             //WORKS TO HERE. HOW DO I TELL THE CURRENT ACTIVITY THE USER IS ON THAT BLUETOOTH HAS DISCONNECTED?
           }
      }

最佳答案

您通常有两种方法...最简单的方法是在您的所有 Activity 中注册接收者。

您可以添加实现观察者模式的自定义应用程序类(或只是单例对象),并在每个 Activity 中订阅它。 (在OnResume中订阅,在onPause中取消订阅)

在我的应用程序中,我更喜欢第一种方式,因为它更简单。但第二种方式更快,如果这对您很重要的话。

这是我的默认 fragment 包装器的代码:

public abstract class BleServiceFragment  extends Fragment{

private static final int REQUEST_ENABLE_BT = 0;
private BluetoothLeService mService=null;

protected abstract BroadcastReceiver getBleReceiver();
private IntentFilter filter =makeFilter();
boolean receiverRegistered=false;

protected IntentFilter makeFilter(){
    IntentFilter filter = new IntentFilter(Const.Intent.BLE_CARD_LIST);
    return filter;
}

@Override
public void onStart() {
    super.onStart();

    final BluetoothManager bluetoothManager =
            (BluetoothManager) getActivity().getSystemService(Context.BLUETOOTH_SERVICE);
    mBluetoothAdapter = bluetoothManager.getAdapter();

    // Checks if Bluetooth is supported on the device.
    if (mBluetoothAdapter == null) {
        Toast.makeText(getActivity(), getResources().getString(R.string.error_bluetooth_not_supported), Toast.LENGTH_SHORT).show();
        getActivity().finish();
        return;
    }
}

@Override
public void onResume() {
    super.onResume();
    if(!mBluetoothAdapter.isEnabled())
    {

            Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);

    }

    getActivity().registerReceiver(getBleReceiver(), filter);
    receiverRegistered=true;
}

@Override
public void onPause()
{
    super.onPause();
    if(receiverRegistered)
    {
        getActivity().unregisterReceiver(getBleReceiver());
        receiverRegistered=false;
    }
}

@Override
public void onStop() {
    super.onStop();
    if(receiverRegistered)
    {
        getActivity().unregisterReceiver(getBleReceiver());
        receiverRegistered=false;
    }
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    // User chose not to enable Bluetooth.
    if (requestCode == REQUEST_ENABLE_BT && resultCode == Activity.RESULT_CANCELED) {
        getActivity().finish();
        return;
    }
    super.onActivityResult(requestCode, resultCode, data);
}

我只是继承了它的所有工作 fragment ,实现 getBleReceiver() 并在需要时重写 makeFilter()

关于java - 处理 Android 蓝牙 LE 断开通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28850261/

相关文章:

java - 尝试运行 Java 应用程序时出现 Eclipse 错误 - "Selection does not contain a main type"- 但确实如此?

java - 如何不对循环内的无效输入增加循环计数器

android - Google Play 中的下载次数

java - Eclipse 4 - 将部分添加到 SashForm

java - 如何在非null值上设置editText

android - 设置EditText光标颜色

java - Maven - 无法复制 webapp 源

java - 如何传入一个类来创建一个类数组?

java - 如何通过将鼠标悬停在变量上来显示变量值

java - 如何在不指定绝对目录的情况下打开文件?